目录
一.二叉查找树
规则:大的存左边,小的存右边,一样的不存
弊端
但是二叉查找树会导致左右子树高度差过多,查找效率变低,形成链表
如果存入数据有序,结构就会如下图所示,这样查找效率和链表差不多
二.平衡二叉树
平衡二叉树本身也是一棵二叉查找树,只不过在二叉查找树的基础上保证了树的平衡
规则:任意节点左右子树高度差不超过1
弊端:由于添加节点需要判断,旋转,导致添加数据速度慢
下图就不是一个平衡二叉树
那么会有一个疑惑,平衡二叉树是如何保持平衡的呢?这就涉及到平衡二叉树的旋转机制了,接下来继续看。
2.1 旋转机制
2.1.1 左旋
- 首先确定支点,从添加的节点开始,不断往父节点找不平衡的节点,把遇到第一个不平衡的点当作支点去旋转
2.把支点降级,变成左子节点
3.晋升原来的右子节点
上面的是一种简单情况,只是为了讲解原理,下面来看常见情景
下面需要将根节点的右侧往左拉,也就是根节点降级
原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点
最后来个左旋动图演示更加清晰明了
2.1.2 右旋
右旋和左旋道理一样的,就不过多讲解了
1.确定支点:从添加的节点开始,不断的往父节点找不平衡的节点,以不平衡的点作为支点
2.把支点右旋降级,变成右子节点
3.晋升原来的左子节点
动图演示
2.1.3 触发机制
添加节点时,破坏了树的平衡,就需要旋转
根据插入的位置又分为4种,左左,右右,左右,右左,看不明白很正常,接下来看图解过程
左左
左左:当根节点左子树的左子树有节点插入,导致二叉树不平衡
情形如下图
只需一次右旋解决问题
右右
右右:当根节点右子树的右子树有节点插入,导致二叉树不平衡
情形如下图
也只是需要一次左旋就能解决问题
接下来的两种稍微有点难度,需要两次旋转
左右
左右:当根节点左子树的右子树有节点插入,导致二叉树不平衡
情形如下图,可以发现一次右旋解决不了问题
可以尝试一次,假如一次右旋,结果如何
下面是右旋一次的结果,二叉树仍然没有平衡
正确操作如下
原树
首先局部左旋,将它变成左左,
然后再进行右旋,结果如下
右左
右左和左右同理
右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡
情形如下图
首先局部右旋,把右左,变为右右
然后再进行左旋,下面是最终结果
三.红黑树
红黑树是一种自平衡的二叉查找树
它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,
每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过红黑规则进行实现的
与平衡二叉树的区别
3.1 红黑规则
①每一个节点或是红色的,或者是黑色的
②根节点必须是黑色
③如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
④如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
⑤对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
树的节点结构如下
而红黑树的结点结构多了一个颜色
如下图就不满足红黑规则⑤对每一个节点,从该节点到其所有后代叶节点(就是Nil节点)的简单路径上,均包含相同数目的黑色节点;
所以18这个结点 应该是红色的
默认颜色:添加节点时默认结点颜色是红色,效率高
还是上图,添加20,18,23;默认黑色的话,18和23 违背原则⑤,都需要调整颜色,调整次数为2
若默认颜色为红,只有20违背原则②根节点必须是黑色,调整次数为1
3.2 添加节点规则
注意:下面几个例子,都是对照这个规则表来的,看例子对照添加规则表才能看清楚
注:叔叔节点就是跟父节点有同一个爷爷节点
3.2.1 父红色策略①
范例:添加15节点,走上表的父为红,叔叔为红 路径①策略
先将父节点设为黑,叔叔节点也设为黑
祖父设为红
祖父非根,以祖父节点再走上面的规则表(就是非根——>父黑色——>不做操作)
最后添加完毕结果图如下
3.2.2 父红色策略③
下面更难的来了,当添加14节点时的情况又该如何
添加14节点,走规则表的非根——>父红色——>③策略
首先将父节点设为黑色
再将祖父节点设为红色
最后以祖父为支点进行右旋,(右旋时不用关心nil节点,可以先去掉,旋完了再补上)
右旋完毕后如下
3.2.3 父红色策略②
最后一种情况
当添加节点为16,按添加规则表上的,走——>非根——>父红色——>③策略
把父节点15作为支点左旋
左旋结果如下
把父节点15作为当前节点,进行判断(也就是再走一遍规则表)
走的规则路线为:非根——>父红色——>③策略(这就是为什么策略③放在策略②前面写了)
策略③:父节点16设为黑色,祖父17设为红色,以祖父为支点,右旋,结果图如下
最后总结红黑树
红黑树的增删改查效率是比较好的,和平衡二叉树不断旋转浪费时间相比,红黑树只改变颜色变量,旋转次数很少,所以效率更高。
至此感谢您的阅览