第五章树与二叉树
1. 树的基本概念
-
树的性质
(1)树的结点数n等于所有的结点的度数之和+1
(2)度为m的树中第i层上至多有$ m^{i-1}$个结点
(3)度为m具有n个结点的树的最大高度为n-m+1 -
二叉树与度为2的有序树的区别
(1)度为2的树至少有3个结点,而二叉树可以为空
(2)二叉树无论孩子是否有两个,均需要区分左右孩子,而度为2的有序树只有一个孩子的话,不需要区分左右孩子 -
满二叉树:一棵高度为h,且有\(2^{h}-1\)个结点的二叉树称为满二叉树
-
完全二叉树是指除了最后一层外,其他任何一层的节点数均达到最大值,且最后一层也只是在最右侧缺少节点
-
非空二叉树的叶结点数等于度为2的结点数加1,即n0 = n2 + 1
-
由二叉树的中序 + 先序/后序/层序可以唯一地确定一棵二叉树.需要注意的是,若只知道二叉树的先序序列和后序序列,则无法唯一确定一棵二叉树.
-
树的存储方式常见有:
(1)双亲表示法:采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲结点在数组中的位置,根节点下标为0,其伪指针域为-1
优点是可以很快得到每个结点的双亲结点,但求结点的孩子时需要遍历整个结构
(2)孩子表示法:将每个结点的孩子结点视为一个线性表,且以单链表作为存储结构,则n个结点就有n个孩子链表
与双亲表示法相反,孩子表示法寻找双亲的操作需要遍历n个结点中孩子链表指针域所指向的n个孩子链表
(3)孩子兄弟表示法(二叉树表示法):
以二叉链表作为树的存储结构.孩子兄弟表示法使每个结点包括三部分内容:结点值,指向结点第一个孩子结点的指针,以及指向结点下一个兄弟结点的指针(沿着此域可以找到结点的所有兄弟结点)
孩子兄弟表示法比较灵活,最大的优点是可以方便地实现树转换为二叉树的操作,易于查找孩子的结点等,但缺点是从当前结点查找双亲结点比较麻烦,若为每一个结点增设一个parent域指向其父节点,则查找也较为方便 -
二叉排序树和平衡二叉树的区别
(1)二叉排序树:左子树上所有结点的关键字均小于根节点的关键字,右子树上所有结点的关键字均大于根结点的关键字,并且左右子树又各是一棵二叉排序树
(2)平衡二叉树:左子树和右子树的深度之差不超过1
2. 线索二叉树
- 引入线索二叉树是为了加快查找结点前驱和后继的速度
3. 平衡二叉树
3.1 平衡二叉树旋转机制
- 规则一:左旋, 规则二右旋
- 触发时机: 当添加一个节点后, 该树不再是一颗平衡二叉树
1. 左旋(从左往右旋)




2. 右旋(从右往左旋)




3.3 平衡二叉树需要旋转的四种情况
1. 左左
- 一次右旋



2. 左右
- 一次局部左旋, 一次整体右旋



3. 右右
- 一次左旋


4. 右左
- 一次局部右旋, 一次整体左旋



4. 红黑树
4.1 红黑树定义
- 红黑树是一种特殊的二叉查找树, 每一个节点上都有一个存储位表示结点的颜色
- 每一个结点是红或者黑, 红黑树不是高度平衡的, 它的平衡是通过红黑规则来实现的
4.2 红黑树规则
- 每一个节点是红色, 或者是黑色的
- 根节点必须是黑色
- 如果一个节点没有子节点或父节点, 则该节点相应的指针属性值为Nil, 这些Nil视为叶节点, 每个叶节点是黑色的
- 不能出现两个红色节点相连的情况
- 任意节点到其所有后代叶节点的简单路径上, 均包含相同数目的黑色节点

4.3 添加节点的规则

5. 树和二叉树的应用
-
若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码
-
哈夫曼树与哈夫曼编码的作用是什么?
(1)哈夫曼树:带权路径长度WPL最小的二叉树
(2)哈夫曼树的作用:用来实现哈夫曼编码,以及后续的解码,用来压缩网络传输的文件

浙公网安备 33010602011771号