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

2023-12-13 05:14:39

目录

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博客

文章来源:https://blog.csdn.net/a1275174052/article/details/134896735
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。