Right Rotation on Node P
如上是以节点 P 为中心进行旋转运算。基本上维持红黑树的演算过程都是由变色与旋转依次组成。总结来说,红黑树的新增与删除操纵是先透过一般二元树的新增与删除操纵后,再从递补的节点开始向上进行红黑树性质维护。接下来,直接用例子演示走过一遍新增与删除节点的算法更能相识到变色与旋转的作用为何: 新增 (Insertion)
在新增操纵上,新插入的节点同等都为赤色,目的是盼望红黑树维持规则 5 的约束,但也大概会违反除了规则 5 以外的其他规则,以是作完二元树新增节点的操纵后,需要以新增的节点开始向上检查红黑树是否符合各项规则,修正红黑树的算法大概会有以下几种情境,因应差别情境会采取差别的修正过程: 情境一:红黑树为空,插入红节点后成为根结点,会违反规则 2,需将该节点改为玄色,即可完成红黑树维护。
Case 1: Red Node on the Empty RB Tree 情境二:在黑节点上与红节点 z 相接,不违反任何规则,无须作其他调整。
Case 2: Red Node on a Black Node 情境三:在红节点上与红节点 z 相接,会违反规则 4。从自己开始维护,若叔叔节点为赤色,则先将父节点涂黑,用以保持规则 4,但这时会违反规则 5,以是须再将祖节点与叔节点分别涂成赤色和玄色。接着再从祖节点继承往上检查维护。
如图片,可以看到最后的结果违反规则 4,该情境符合情境四所示,其父节点与自身皆为赤色,以是下一轮会再以对应的流程处理。
Case 3: Red Node on a Red Node with its Red Uncle Node 情境四:在红节点上与红节点 z 相接,会违反规则 4。从自己开始维护,若叔叔节点为玄色且自己位置在父节点右边的状态,则先以父节点进行左旋,形成情境五,再作为情况五进行下一轮的处理。
Case 4: Red Node on the Right Side of Red Node with its Black Uncle Node 情境五:在红节点上与红节点 z 相接,会违反规则 4。从自己开始维护,若叔叔节点为玄色且自己位置在父节点左边的状态,则先将父节点改为玄色,用以保持规则 4,但这时会违反规则 5,以是须再将祖节点涂成赤色,接着再以祖节点进行右旋,即能完成维护。(直觉上,节点 F 的左边路径会多一个玄色,可以透过右旋把玄色转掉)
Case 5: Red Node on the Left Side of Red Node with its Black Uncle Node 删除 (Deletion)
在删除操纵上,删除一个节点时大概也会违反规则,以是作完二元树删除节点的操纵后,视需要以递补节点开始向上检查红黑树是否符合各项规则,修正红黑树的算法大概会有以下几种情境,因应差别情境会采取差别的修正过程:
**情境一:**删除红节点,不违反任何规则,无须进行维护。
Case 1: Deletion on Red Node 情境二:删除节点为玄色需要进行维护。删除黑节点后,如果递补上来的节点为赤色时,由于黑节点被删除会违反规则 5,以是直接将递补的红节点涂黑即可。或者,如果维护点在根结点时,如果根节点为赤色,这时则违反规则 2,直接将根节点涂黑即可。
Case 2: Deletion on Black Node with Red Node Compensation 情境三:删除节点为玄色需要进行维护。删除黑节点后,如果递补上来的节点为玄色时,需要视情况补足路径上缺失的一个玄色,会以递补节点作为当前节点开始进行维护:
兄弟节点如果赤色,则将兄弟节点涂黑、父节点涂红、再以父节点为基准左旋 (由于节点 C 的左边路径会少一个玄色,直觉会是透过左旋把玄色补起来)。但是可以发现现在的红黑树还是违反规则 5,固然无法完全解决标题,但是递补节点的兄弟节点改变了,可以新情境再下一轮进行对应的修正。
Case 3: Deletion on Black Node with Black Node Compensation and Red Sibling Node 情境四:删除节点为玄色需要进行维护。删除黑节点后,如果递补上来的节点为玄色时,需要视情况补足路径上缺失的一个玄色,会以递补节点作为当前节点开始进行维护:
兄节点如果玄色,且兄节点之左节点与右节点同为玄色的时候,则将兄节点涂红。这时若父节点为赤色则结束修正后将父节点涂黑即可,但是如果父节点为玄色,则需要再从父节点开始进行修正 (由于也要照顾到父节点的兄门生树,看看是否也满意规则 5)。
Case 4: Deletion on Black Node with Black Node Compensation and Black Sibling Node with its Two Black Child Nodes 情境五:删除节点为玄色需要进行维护。删除黑节点后,如果递补上来的节点为玄色时,需要视情况补足路径上缺失的一个玄色,会以递补节点作为当前节点开始进行维护:
兄节点如果玄色,且兄节点之左节点为赤色、右节点为玄色的时候,则将兄节点涂红、兄节点之左节点涂黑,再以兄节点为基准右旋,接着再进行下次的修正 (若采用左旋会变成相同情境,以是只好右旋,才大概跳离循环)。
Case 5: Deletion on Black Node with Black Node Compensation and Black Sibling Node with its Red Left Child Node 情境六:删除节点为玄色需要进行维护。删除黑节点后,如果递补上来的节点为玄色时,需要视情况补足路径上缺失的一个玄色,会以递补节点作为当前节点开始进行维护:
兄节点如果玄色,且兄节点之右节点为赤色的时候,则将兄节点涂成与父节点相同的颜色、父节点涂黑、兄节点的右节点涂黑,再以父节点为基准左旋即可。(透过左旋与涂色操纵将右边的玄色往左调整、并将右边红点涂黑补足缺失,盼望符合规则 5 来让每条路径上玄色节点的数目同等)
Case 6: Deletion on Black Node with Black Node Compensation and Black Sibling Node with its Red Right Child Node
红黑树谨遵单单五条规则,前人总结了各种情况后,列出对应的处理方式。过后理解情境的对应处理方式固然有迹可循,但是窥探此中奥秘却也令人慑服,很难想像这项算法从无到有所付出的庞大心力与挫折! Reference
Wikipedia Contributors, “Red–black tree,” January 23, 2020. [Online]. Available: https://en.wikipedia.org/wiki/Red%E2%80%93black_tree. [Accessed February 07, 2020].
ITREAD01, “资料布局与算法:红黑树 (Red Black Tree),” January 06, 2019. [Online]. Available: https://www.itread01.com/content/1546725999.html. [Accessed February 07, 2019].
Chiu CC, “Red Black Tree: Insert(新增资料)与Fixup(修正),” January 27, 2016. [Online]. Available: http://alrightchiu.github.io/SecondRound/red-black-tree-insertxin-zeng-zi-liao-yu-fixupxiu-zheng.html. [Accessed January 30, 2020].
Chiu CC, “Red Black Tree: Delete(删除资料)与Fixup(修正),” January 30, 2016. [Online]. Available: http://alrightchiu.github.io/SecondRound/red-black-tree-deleteshan-chu-zi-liao-yu-fixupxiu-zheng.html. [Accessed January 30, 2020].
红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为现在的红黑树。红黑树具有良好的服从,它可在 O(logN) 时间内完成查找、增加、删除等操纵。 二、为什么需要红黑树?
对于二叉搜刮树,如果插入的数据是随机的,那么它就是靠近平衡的二叉树,平衡的二叉树,它的操纵服从(查询,插入,删除)服从较高,时间复杂度是 O(logN)。但是大概会出现一种极度的情况,那就是插入的数据是有序的(递增或者递减),那么所有的节点都会在根节点的右侧或左侧,此时,二叉搜刮树就变为了一个链表,它的操纵服从就低落了,时间复杂度为 O (N),以是可以认为二叉搜刮树的时间复杂度介于 O(logN)和 O (N) 之间,视情况而定。那么为了应对这种极度情况,红黑树就出现了,它是具备了某些特性的二叉搜刮树,能解决非平衡树标题,红黑树是一种靠近平衡的二叉树(说它是靠近平衡由于它并没有像 AVL 树的平衡因子的概念,它只是靠着满意红黑节点的 5 条性质来维持一种靠近平衡的布局,进而提升团体的性能,并没有严格的卡定某个平衡因子来维持绝对平衡)。 三、红黑树的特性
有 n 个节点的红黑树的高度最多是 2log(n+1),这是为什么呢?
首先我们来我们思量一个标题,根节点为黑高为 h 的红黑树,内部节点个数至少有多少个?(黑高:从某节点出发(不含该节点)到达任意一叶节点的路径上黑节点的总数。)
内部节点上最少的情况就是总共 h 层黑节点的满树形态。若根节点黑高为 h,内部节点数最少有 2h-1 个。因此,若红黑树总高度为 h ,则根节点的黑高肯定是大于等于 h/2 的,因此内部节点数 n >= 2h/2-1,由此推出 h <= 2log(n+1) 。
通过红黑树系列的文章,我们已经知道,红黑树的所有插入情况分为以下五种: 情况 1:新结点 N 位于树的根结点,没有父结点 情况 2:新结点的父结点 P 是玄色 情况 3:父结点 P、叔叔结点 U,都为赤色
【对应于第二篇文章中的情况 1:z 的叔叔是赤色的】 情况 4:父结点 P 是赤色的,叔叔结点 U 是玄色或 NULL
【对应第二篇文章中的情况 2:z 的叔叔是玄色的,且 z 是右孩子】 情况 5:父结点 P 是赤色,而叔叔结点 U 是玄色或 NULL
要插入的结点 N 是其父结点的左孩子,而父结点 P 又是其祖父 G 的左孩子
【对应第二篇文章中情况 3:z 的叔叔是玄色的,且 z 是左孩子】
首先,各个结点插入与以上的各种插入情况,逐一对应起来,如下图所示。
二、红黑树的删除情况全程演示
红黑图的所有删除情况,如下所示。 情况 1:N 是新的根 情况 2:兄弟结点 S 是赤色的
【对应于第二篇文章中情况 1:x 的兄弟结点 w 是赤色的】 情况 3:兄弟结点 S 是玄色的,却 S 的两个儿子都是玄色的。但 N 的父结点 P 是玄色
【对应于第二篇文章中情况 2:x 的兄弟结点 w 是玄色的,且兄弟结点 w 的两个儿子都是玄色的】
(这里,N 的父结点 P 为玄色) 情况 4:兄弟结点 S 是玄色的,S 的儿子也都是玄色的,但是 N 的父亲 P 是赤色
【对应于第二篇文章中情况 2:x 的兄弟结点 w 是玄色的,且 w 的两个孩子结点都是玄色的】
(这里,N 的父结点 P 为赤色) 情况 5:兄弟结点 S 为玄色,S 的左孩子为赤色,S 的右孩子是玄色,而 N 是它父结点的左儿子
// 此种情况,最后转化为下面的情况 6
【对应于第二篇文章中情况 3:x 的兄弟 w 是玄色的,w 的左孩子是赤色的,w 的右孩子是玄色】 情况 6:兄弟结点 S 是玄色的,S 的右孩子是赤色的,而 N 是它父结点的左儿子
【对应于第二篇文章中情况 4:x 的兄弟结点 w 是玄色的,且 w 的右孩子是赤色的】
各个结点的删除与以上六种情况逐一对应起来,如下图所示。