C语言 二叉树详解(自我理解版)!!!二叉树的实现

目录

1.树的概念和结构(了解)

1.1树的概念

1.2关于树的每个组成结构的叫法

1.3树的结构体表示

1.4树在实际中的运用 

2.二叉树的概念和结构和实现(本期偏重点之一)

  二叉树的概念

​编辑 特殊的二叉树

1.完全二叉树

2.满二叉树(完全二叉树的特殊情况)

 关于一部分二叉树的性质(可以用来做题)

关于二叉树的储存结构 


1.树的概念和结构(了解)

1.1树的概念

对于树来说,树并不是线性的,它是由n个节点(n>=0)组成的一种具有层次的结构。

对于树这个结构来说,这个结构很像是一棵倒着的树,所以名字就叫做树。

 这是一个高度为4的树,可以看出这个树A这个节点只有一个,这个节点叫做根节点。就很像树杆

除根节点外, 其余结点被分成M(M>0)个互不相交的集合T1T2……Tm ,其中每一个集合 Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有 0 个或多个后继。(就像如果以B作为一个根,把其他的节点蒙住,B又可以看作一棵树)
因此, 树是递归定义 的。
同时在树中你的同层的节点是可以相交的,但是一棵子树不能有两个父亲,也不能 你的爸爸生了你的孩子
每个节点有且仅有一个父节点。
N个节点就有N-1条边。

1.2关于树的每个组成结构的叫法

节点的度 :一个节点含有的子树的个数称为该节点的度; 如上图: A 的为3
叶节点或终端节点 :度为 0 的节点称为叶节点; 如上图:K L F G M I J  节点为叶节点
非终端节点或分支节点 :度不为 0 的节点; 如上图:B C D E H  节点为分支节点
双亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图: A B 的父节点
孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; 如上图: B A 的孩子节点
兄弟节点 :具有相同父节点的节点互称为兄弟节点; 如上图: B   C  D 是兄弟节点
树的度 :一棵树中,最大的节点的度称为树的度; 如上图:树的度为3, A 和 D 的度都是3
节点的层次 :从根开始定义起,根为第 1 层,根的子节点为第 2 层,以此类推;
树的高度或深度 :树中节点的最大层次; 如上图:树的高度为 4
堂兄弟节点 :双亲在同一层的节点互为堂兄弟;如上图: H   I  J  互为兄弟节点
节点的祖先 :从根到该节点所经分支上的所有节点;如上图: A 是所有节点的祖先
子孙 :以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是 A 的子孙
森林 :由 m m>0 )棵互不相交的树的集合称为森林;

1.3树的结构体表示

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

这是一棵树的结构体内容,一般一棵树的存储内容就是,孩子节点和兄弟节点的指针,之后就是这个节点存放的值 元素。

1.4树在实际中的运用 

这是一棵表示文件目录系统的树。 

2.二叉树的概念和结构和实现(本期偏重点之一)

  二叉树的概念

 二叉树是一个集合,这个集合要么为空,要么就是一个根节点,要么就是根节点的下面有左子树和右子树(其中一个可以为空)。

由这张图可以看出,二叉树每个结点的度(就是子节点的个数)一定小于 2。

二叉树有左树和右树之分,如果在一个数组里面,左树的数据是在右树前面的,次序不能颠倒,因为二叉树是有序的。

 特殊的二叉树

1.完全二叉树

如图这是一个完全二叉树,完全二叉树与普通二叉树之间的差别在于,完全二叉树 的每一个子节点必须先有左边的子节点,才能有右边的子节点。直到一层塞满,再放下一层

2.满二叉树(完全二叉树的特殊情况)

如图这是一个满二叉树,他就是一个完全二叉树,完全二叉树每层都塞满的时候,就是一个满二叉树

 关于一部分二叉树的性质(可以用来做题)

1. 若规定根节点的层数为 1 ,则一棵非空二叉树的 i 层上最多有 2的(i - 1)次方个结点.
2. 若规定根节点的层数为 1 ,则 深度为 h 的二叉树的最大结点数是  2 的 h 次方 - 1
.
3. 对任何一棵二叉树 , 如果度为 0 其叶结点个数为n0 , 度为 2 的分支结点个数为n0 - 1  , 则有n0 =n2 + 1
4. 若规定根节点的层数为 1 ,具有 n 个结点的满二叉树的深度 h=log n+1
. (ps : 是log 2 为底,n+1 为对数 )
5. 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对 于序号为i 的结点有:
1. i>0 i 位置节点的双亲序号: (i-1)/2 i=0 i 为根节点编号,无双亲节点
2. 2i+1<n ,左孩子序号: 2i+1 2i+1>=n 否则无左孩子
3. 2i+2<n ,右孩子序号: 2i+2 2i+2>=n 否则无右孩子

关于二叉树的储存结构 

二叉树既可以用 顺序表的结构类型来进行存储,也可用链表的结构类型进行存储。

1.顺序结构

顺序结构的意思就是用数组进行存储,在物理结构储存上就是连续的。

但一般使用数组表示的话基本都是完全二叉树,因为必须保持有序,如果不是完全二叉树就会出现空间浪费的情况。(就如果J 是 E的右节点的话,那E的左节点就没有数据就浪费了一个空间)这里的父节点和子节点的计算可用 公式 child = parent / 2  + 1 (左节点)或 + 2(右节点).。

 

2.二叉树的链式储存,即把二叉树的节点以链表的结构进行存储。 这里的父亲节点里就得存储 左右两个子节点的指针。

当然既然是链式结构,上面的顺序结构可以找到父亲节点,那链式结构也有办法找到父节点,这就要用的三个指针的结构体,左右孩子节点,再加上父亲节点的指针。叫三叉链表 !

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
};

这是两种链表的结构体存储内容。 

二叉树的实现放到下一章。 

C 语言 二叉树的实现详解!!!(每种方法都详细解释,哪里不会看哪里)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/241418.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS4.0从零开始的开发教程11Video组件的使用

HarmonyOS&#xff08;九&#xff09;Video组件的使用 概述 在手机、平板或是智慧屏这些终端设备上&#xff0c;媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集&#xff0c;还是视频的播放、切换、循环&#xff0c;亦或是相机的预览、拍照等功能…

react 学习笔记 李立超老师(学习中~) | JSX - React组件 - 钩子函数

文章目录 react学习笔记01入门概述React 基础案例HelloWorld三个API介绍 JSXJSX 解构数组 创建react项目(手动)创建React项目(自动) | create-react-app事件处理React中的CSS样式内联样式 | 内联样式中使用state (不建议使用)外部样式表 | CSS Module React组件函数式组件和类组…

郑重声明 | 【机器学习之心】无小号,打者本人旗号干活的其他号,本人概不负责,可笑,未经过我同意就成你们的合作账号了?

打着本人旗号的号如下&#xff08;主要是天天Matlab团队&#xff09; 可笑&#xff0c;未经过我同意就成你们的合作账号了&#xff1f; 天天Matlab科研工作室 科研助手大师 机器学习之星主&#xff08;这个恶心&#xff0c;名字都仿我&#xff09; 海神之光 上述号没有程序售…

亚马逊鲲鹏系统:防关联技术守护您的账户安全

亚马逊买家账号注册是一项相当简便的操作&#xff0c;但当涉及到批量注册时&#xff0c;我们就需要更加注意防关联的问题。对于那些对此领域不够熟悉的朋友们&#xff0c;可以使用亚马逊鲲鹏系统&#xff0c;这款系统能够为我们提供一站式的解决方案。该系统不仅支持买家账号的…

Windows提权方法

简介 内网提权&#xff0c;本意为通过某些服务的漏洞&#xff0c;从而获取到该服务器的shell&#xff0c;进而内网渗透&#xff0c;最终从普通用户变成超级管理员的一个过程 以下是一些常见的内网提权原理和方法&#xff1a; 横向移动&#xff1a;攻击者通过在内网中的一台受感…

(五)STM32 NVIC 中断、优先级管理及 AFIO 时钟的开启

目录 1. 中断相关知识简介 1.1 什么是中断 1.2 什么是内中断、外中断 1.3 什么是可屏蔽中断、不可屏蔽中断 2. CM3 内核中断介绍 2.1 F103系统异常清单 2.2 F103 外部中断清单 3. NVIC 简介 3.1 NVIC 寄存器简介 3.2 NVIC 相关寄存器的介绍 4. 中断优先级 4.1 优先…

同义词替换器降低论文重复率的最新技术进展

大家好&#xff0c;今天来聊聊同义词替换器降低论文重复率的最新技术进展&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;同义词替换器降低论文重复率的最新技术进展 一、引言 随着学术…

Android : Room 数据库的基本用法 —简单应用_一_入门

1.Room介绍&#xff1a; Android Room 是 Android 官方提供的一个持久性库&#xff0c;用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层&#xff0c;使得使用 SQLite 数据库变得更加容易和方便。 以下是 Android Room 的主要特点&#xff1a; 对象关系映射…

一个人全干!之后台管理中的搜索区域的展开收缩组件。

后台管理系统中大多数都有列表的搜索&#xff0c;那么用户的需求又需要必要时收缩搜索区域&#xff0c;需要时再展开。 而且怪的是他还需要一些部分不可收缩&#xff0c;不需要的地方才收缩。使用v-if来解决吧又不咋美观&#xff0c;我们还需要一个简单的动画效果。我们先写一…

.NET医院检验系统LIS源码,使用了oracle数据库,保证数据的隔离和安全性

医院检验系统LIS源码&#xff0c;LIS系统全套商业源码 LIS系统实现了实验室人力资源管理、标本管理、日常事务管理、网络管理、检验数据管理&#xff08;采集、传输、处理、输出、发布&#xff09;、报表管理过程的自动化&#xff0c;使实验室的操作人员和管理者从繁杂的手工劳…

vue的computed中的getter和setter

vue的computed中的getter和setter 定义getter写法setter写法 定义 computed 中可以分成 getter&#xff08;读取&#xff09; 和 setter&#xff08;设值&#xff09;&#xff0c;一般情况下是没有 setter 的&#xff0c;computed 预设只有 getter&#xff0c;也就是只能读取&a…

【EI会议征稿】第三届电力系统与电力工程国际学术会议(PSPE 2024)

第三届电力系统与电力工程国际学术会议&#xff08;PSPE 2024&#xff09; 2024 3rd International Conference on Power System and Power Engineering(PSPE 2024) 第三届电力系统与电力工程国际学术会议&#xff08;PSPE 2024&#xff09;于2024年3月29-31日在中国三亚隆重召…

CVPR 2023 三维重建相关必读论文和代码合集

三维重建涉及将二维图像或视频转换为三维模型的过程&#xff0c;这个过程需要应用到多门学科的知识&#xff0c;比如数学、计算机图形学和多视图几何等&#xff0c;学习门槛较高。但尽管如此&#xff0c;三维重建仍然是CV领域的一个热门方向。 目前三维重建技术已经有了广泛应…

Spring Boot 3.x.x Spring Security 6.x.x @PreAuthorize 失效

Spring Boot 3.x.x Spring Security 6.x.x PreAuthorize 失效 背景问题解决备注 背景 最近在搞一个后端项目&#xff0c;登录、接口权限、token认证。 版本 Spring Boot 3.2.0 JDK 21 Spring Security 6.2.0 问题 PreAuthorize 失效&#xff0c;没有走认证。 解决 给PreAu…

金属制造ERP是什么?可以帮助企业解决什么问题

不同的金属有不同的制造工艺和生产工序&#xff0c;有些金属制造企业并不能按照既有的生产计划执行下去&#xff0c;此外有些工艺还可能受到设备或资源等影响造成部分加工流程出现问题&#xff0c;从而导致物料损耗大&#xff0c;产品交期延误等。 另外&#xff0c;有些金属制…

nodejs微信小程序+python+PHP沧州地区空气质量数据分析系统-计算机毕业设计推荐 django

本系统不仅主要实现了注册登录&#xff0c;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;城市区域管理&#xff0c;空气状况管理&#xff0c;空气质量管理&#xff0c;系统管理&#xff0c;数据爬取&#xff0c;大屏分析等功能&#xff0c;通过这些功能基本可…

Android---Kotlin 学习005

substring 字符串截取。相加与 java&#xff0c;kt 里面的 substring 函数支持 IntRange 类型&#xff08;表示一个整数范围的类型&#xff09;的参数&#xff0c;until 创建的范围不包括上限值。 const val NAME "Jimmys friend" fun main(){val index NAME.ind…

fuxploide,一款针对文件上传的Fuzz检测工具

fuxploide,一款针对文件上传的Fuzz检测工具 1.工具概述2.安装3.参数解析4.使用案例1.工具概述 Fuxploider 是一种开源渗透测试工具,可自动检测和利用文件上传表单缺陷。该工具能够检测允许上传的文件类型,并能够检测哪种技术最适合在所需的 Web 服务器上上传 Web Shell 或任…

Xubuntu16.04系统中使用EDIMAX EW-7822UAC无线网卡开启5G自发AP

目录 1.关于 EDIMAX EW-7822UAC2.驱动安装3.查看无线网卡信息3.通过create_ap配置5G自发AP 1.关于 EDIMAX EW-7822UAC 官网介绍 https://www.edimax.com/edimax/merchandise/merchandise_detail/data/edimax/global/wireless_adapters_ac1200_dual-band/ew-7822uac/ 详细参数…

HarmonyOS:NativeWindow 开发指导

场景介绍 NativeWindow 是 HarmonyOS 本地平台化窗口&#xff0c;表示图形队列的生产者端。开发者可以通过 NativeWindow 接口进行申请和提交 Buffer&#xff0c;配置 Buffer 属性信息。 针对 NativeWindow&#xff0c;常见的开发场景如下&#xff1a; ● 通过 NativeWindow…
最新文章