17.1-红黑树之插入调整(数据结构基础篇)

95 阅读5分钟

红黑树的基本概念

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 [2]

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

image-20210815210053687

红黑树的平衡条件

  1. 每个节点非黑即红
  2. 根节点是黑色
  3. 叶子节点(NIL)是黑色(注意,这里说的叶子节点实际上是指虚拟空节点NIL节点,所以上面给出的红黑树的图中,其实每个节点下面都还挂着两个NIL节点,这些NIL节点都是黑色)
  4. 如果一个节点是红色,那么他的两个子节点都是黑色
  5. 从根节点出发,所有的节点路径上,所有的黑节点数量相同

对于平衡条件的理解

红黑树中最长路径与最短路径的关系

根绝红黑树的平衡条件4和5两点,我们知道,最短路径应该都是由黑色节点组成,而最长路径,则应该是红黑相间的,因此,最长路径应该是最短路径的长度的2倍

如何理解平衡条件3中的NIL节点

NIL节点就像是文章中的标点符号,虽然不属于文章内容的部分,平时也很容易被人忽略,但,如果一篇文章没有标点符号,会让文章开起来“狗屁不通”,非常费劲。这里的NIL也是一样。

新插入的节点是红色还是黑色

根据上面第5点平衡条件,所有路径上的黑色节点数量相同,如果我们新插入的节点颜色时黑色的话,那么一定会导致我们的红黑树的某一条路径上的黑色节点数量比其他路径多,红黑树一定会失衡。因此,我们新插入的节点应该是红色,因为插入红色节点,只是有一定的概率会失衡(当新节点插入到原本是红色的节点下面的时候会失衡,而插入到黑色节点下面则不会),但是,插入黑色节点,则必定会失衡。

红黑树平衡调整的法门

PS: AVL树是站在父节点向下看是否失衡

插入调整

插入调整站在祖父节点向下看,即站在当前节点,要解决下两层的平衡冲突问题(如果在插入调整时当前节点和子节点发生平衡冲突,不需要解决,因为当前节点是父节点,而插入调整是要在祖父节点的视角去调整的)

举个例子:如果你和你爸打架了,两个人都是杠精,此时就需要你爷爷出来调停

删除调整

删除站在父节点向下看,即站在当前节点,要解决下一层的平衡冲突问题

插入调整

插入调整就是为了干掉“双红节点”,即当前节点是红色,父节点也是红色。

插入调整的原则:调整之前路径上黑色节点数量等于调整之后黑色节点数量

原因:由于我们插入调整时是在一个大的红黑树的某一小段的子树上操作的,为了确保整颗二叉树上的黑色节点不受影响,因此要确保该子树调整前和调整后黑色节点数量要想同

插入调整情况一

case1

插入调整情况二

LL型失衡

从当前节点看,左子树时红色,左子树的左子树时红色,右子树是黑色,那么这种情况就是“LL型”失衡

LL

LR类型失衡

从当前节点看,左子树时红色,左子树的右子树时红色,右子树是黑色,那么这种情况就是“LR型”失衡

LR

RR类型失衡

与LL类型失衡相对称,进行一个大左旋之后,在按照红色上浮红色下沉操作即可重归平衡

RL型失衡

与LR型失衡相对称,先进行一个右旋,然后再按照RR类型的失衡调整方式处理即可

红黑树插入调整代码演示

处于渐进式学习的原因,此处只给出了红黑树插入调整相关的代码,完整代码请移步红黑树之删除调整

rbTree

尝试还原红黑树

restore

总结

通过上面的对照,我们发现,我们生成的红黑树是满足所有平衡条件的,从上面的红黑树中,我们也不难看出,红黑树是一个特殊的AVL树(平衡条件特殊),而AVL树又是特殊的二叉搜索树(多了高度差的限制),而二叉搜索树又是特殊的二叉树(中序遍历结果是有序序列)。

综上,我们可以知道,一个高级数据结构基本上都是由一些相对低级的数据结构层层递进演化而来的,高级的数据结构也有可能是某些数据结构在某些情况的特殊化,高级数据结构继承了低级数据结构的特性,并具备了一些自己的新特性,这很像我们程序里面的继承