介绍
二叉树是一种常见的树,每个节点 最多有两个子节点:
- 左子节点
- 右子节点
每个节点都包含一个值或者数据,值可以是任何类型的数据。
二叉树分类
空树,即:没有结点的树
1个结点的树
单支树
满二叉树
完全二叉树
非完全二叉树
空树
没有结点的树
1个结点的树
即:只有一个节点
单支树
单支树指的是:只有一个孩子并且方向一致,如下图:4层的左单支树和右单支树
类比:相当于链表
特点
每个结点最多只有一个孩子结点,
完全二叉树
深度为 k、有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 k 的满二叉树中编号 从1至n 的结点一一对应时,称之为完全二叉
理解
除了最后一层,所有层都填满。最后一层的节点 靠左排列,只允许右边空缺,但不能中间空缺。编号是连续的
一句话:从上到下、从左到右依次填满,只允许 最后一层右边缺。编号连续的
特征
- 除最后一层外,其他层都是满的
- 最后一层节点必须靠左连续排列
- 非常适合用数组存储(堆就是完全二叉树)
非完全二叉树
如下图:各层结点 不是 从左到右依次放置,编号 不是 连续的,就是非完全二叉树
满二叉树
若深度为 k 的二叉树有 2^k - 1 个结点,就是满二叉树
提示: -1 是因为 根只有一个结点
理解
除了叶子节点,每个结点下面都有两个子节点。编号连续
连续编号
编号从根结点起,自上而下、自左至右依次进行
可以对满二叉树连续编号,如上图
特征
高度为
k的满二叉树,节点总数 2_k-1所有叶子节点都在最后一层
是最 “完美” 的二叉树结构
完全二叉树、满二叉树
满二叉树一定是完全二叉树
完全二叉树不一定是满二叉树
满二叉树是完全二叉树的 “特例”。
存储结构
顺序存储 - 方式一
用一组连续的存储单元存储二叉树中的节点,按照从上到下,从左到右的顺序依次存储每个节点
缺点:没有存位置信息,无法还原树,摒弃
顺序存储 - 方式二
先计算出与该树对应的满二叉树的结点数量,定义数组,按照结点编号放入到应对的索引位置
根据上面的树,算出满二叉树的结点数量,按照结点编号放入到应对的索引位置,如下图:
优点:能还原树
缺点:浪费空间
链式存储 - 二叉链表
用二叉链表来存储二叉树节点,二叉链表中每个元素包含:
- 该节点本身的数据
- 左孩子结点的指针
- 右孩子结点的指针
即:一个数据 + 两个指针,每个二叉链表节点存储一个二叉树节点,头指针则指向根节点
优点:能还原树,不浪费空间
缺点:无法根据子结点找到父结点
特性
特性1
在二叉树的第
i层上最多有 2^{i-1}个结点 (i从1开始)深度为
k的二叉树最多有 2^k-1 个结点(k从1开始)
特性2 - 完全二叉树特性
如果对一棵有 n 个结点的完全二叉树的结点按层序编号(从第1层到 \left \lfloor log_2n \right \rfloor + 1 层,每层从左到右),则对任一结点 i ( 1≤i≤n )
提示: 符号 \left \lfloor \right \rfloor 表示取低函数,即:向下取整
有:
如果
i=1,则结点i无父结点,是二叉树的根如果
i>1,则父结点是 \left \lfloor \frac{i}{2} \right \rfloor如:上图结点
3,代入公式,父结点:\left \lfloor \frac{3}{2} \right \rfloor = 1如果
2i>n,则结点i为叶子结点(无左子结点);否则,其左子结点是2i;如:上图结点
4,代入公式,2 * 4 > 6,是叶子节点,无左子结点;上图结点2,代入公式,2 * 2 < 6,不是叶子节点,左子结点是4如果
2i+1 > n,则结点i无右子叶点,否则,其右子结点是结点2i+1如:上图结点
3,代入公式,2 * 3 + 1 > 6,无右子结点;上图结点2,代入公式,2 * 2 + 1 < 6,右子结点是5
特性3
对任何一棵二叉树,如果其 叶子结点数 为 n_0,度为 2 的结点数为 n_2,则 n_0 = n_2 + 1
提示: 度为 2 的结点,表示该结点有 2 个子树
理解:有公式可以推导,但复杂,直接看上图:
- 叶子结点:
4、5、6,共3个 - 度为
2的结点:1、2,共2个
结论: 3 = 2 + 1
特性4 - 具有N个结点的二叉树形态数
有公式,复杂,略
原理:拿出 1个结点做根,剩余结点分成 2组,在左右两侧分布排列。
0个结点的二叉树形态
1种:空树1个结点的二叉树形态
1种:单结点树3个结点的二叉树形态
5种:1个是根节点,其余结点:左0右2、左1右1、左2右0,其中,有两个结点的又有2个形态。4个结点的二叉树形态
14种- 5个结点的二叉树形态
42种
特性5
上图可知:
- 度为
2的结点:1、2,共2个 - 度为
1的结点:3,共1个
线的数量 + 1 = 结点的数量
即:
度为m * 度为m的数量 + 度为n * 度为n的数量 + ... + 1 = 结点数量
代入公式:
2(度为2) * 2(度为2的数量) + 1(度为1) * 1(度为1的数量) + 1 = 6
题
思考:各个结点的编号为多少?
分析
根结点 A 的编号是 1
根据上面特性:左节点的编号是 2i,右节点的编号是 2i + 1,
所以:
B编号2C编号3D编号6E编号7F编号14
题
对下面的二叉树进行顺序存储(用数组MEM表示),已知结点A、B、C在MEM中对应元素的下标分别为1、2、3,那么结点D、E、F对应的数组元素下标为( )
A、4、5、6
B、4、7、10
C、6、7、8
D、6、7、14
分析
根据上面的 特性2 可知:
D的下标是C的下标 * 2 = 3 * 2 = 6E的下标是C的下标 * 2 + 1 = 3 * 2 + 1 = 7F的下标是E的下标 * 2 = 7 * 2 = 14
答案
D
题
设某二叉树采用二叉链表表示(即结点的两个指针分别指示左、右孩子)。当该二叉树包含k个结点时,其二叉链表结点中必有()个 空的孩子指针
A、k-1
B、k
C、k+1
D、2k
分析
没什么更好的方法,就是随便画个二叉树,计算空的孩子指针,如下图:
答案
C
题
已知树T的度为 4,且度为 4 的结点数为 7 个、度为 3 的结点数为 5 个、度为 2 的结点数为 8 个、度为 1 的结点数为 10 个,那么T的叶子结点个数为( )。(注:树中结点个数称为结点的度,结点的度中的最大值称为树的度。
A、30
B、35
C、40
D、49
分析
由特性5可知:
4 * 7 + 3 * 5 + 2 * 8 + 1 * 10 + 1 = 7 + 5 + 8 + 10 + 叶子节点数量
所以:
叶子节点数量 = 40
答案
D
参考:
https://blog.csdn.net/aa2528877987/article/details/135436389








