目录
一、平衡二叉树
平衡二叉树就是在二叉查找树的基础上+旋转规则
旋转的目的是要:控制每一个节点的左右子树高度相差不大于1.
1.旋转分类
(1)左旋
A.确定支点:从添加的节点开始,不断的往父节点找不平衡的节点
简单的 B.以不平衡的点作为支点,把支点左旋降级,变成左子节点,晋升原来的右子节点
复杂的 B. 以不平衡的点作为支点,将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点
下面是简单和复杂左旋的结果:
(2)右旋
A.确定支点:从添加的节点开始,不断的往父节点找不平衡的节点
简单的 B.以不平衡的点作为支点,把支点右旋降级,变成右子节点,晋升原来的左子节点
复杂的 B. 以不平衡的点作为支点,将根节点的左侧往右拉,原先的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子节点
下面是简单和复杂右旋的结果:
2.需要旋转的四种情况
(1)左左
当根节点左子树的左子树有节点插入,导致二叉树不平衡
如何旋转:一次复杂右旋
旋转结果如下
(2)左右
当根节点左子树的右子树有节点插入,导致二叉树不平衡
如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋
一次局部左旋和一次复杂右旋的过程图如下:
(3)右右
当根节点右子树的右子树有节点插入,导致二叉树不平衡
如何旋转: 直接对整体进行左旋即可
(4)右左
当根节点右子树的左子树有节点插入,导致二叉树不平衡
如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋
一次局部右旋和一次复杂左旋的过程图如下:
二、红黑树
1.红黑树的特点
-
平衡二叉B树,二叉查找树
-
每一个节点可以是红或者黑
-
红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的
2.红黑规则
-
每一个节点或是红色的,或者是黑色的
-
根节点必须是黑色
-
如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
-
如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)
-
对每一个节点,从该节点到其所有后代叶节点的简单路径(不能回头)上,均包含相同数目的黑色节点
简单记就是
3.添加节点后如何保持规则(违规才需要做)
4.示例
将下面数据按从左到右的顺序添加构造红黑树:
20 18 23 22 17 24 19 15 16
添加节点时,默认为红色,效率高
(1)添加20
违反规则根节点必须是黑色,按照3维护红黑树
(2)添加18
没有违反规则
(3)添加23
没有违反规则
(4)添加22
违反规则两红不能在一起, 按照3维护红黑树
(5)添加17
没有违反规则
(6)添加24和19
都没有违反规则
(7)添加15
违反规则两红不能在一起, 按照3维护红黑树
(8)添加16
违反规则两红不能在一起, 按照3维护红黑树