LLRB 左倾红黑树(三)deleteMax moveRedRight到底做了什么?
deleteMax中,调用了moveRedRight,这个步骤到底是做什么?在什么情况下触发?
首先,我们要确认进入moveRedRight的条件。
1、显式的条件是 h.right == 黑色,h.right.left==黑色
2、隐藏条件,h.left == 黑色(若h.left红色,deleteMax第一步将会对其进行右旋转,节点的右孩子会变为红色,无法进入moveRedRight)
以上两个条件,意味着,这颗2-3树(左倾红黑树)
1、当前节点是一个2-节点(左右孩子都黑)
2、当前节点的右孩子,也是一个2-节点(h.right.left黑色,h.right.right也黑色,因为这是23红黑树,没有经过变化时,任何right不可能红色)
其次,进入moveRedRight之后,又分两种情况,h.left.left红色或黑色。
情形一:进入moveRedRight,且h.left.left==red
考虑用AHEFLKICJGBD,构造RedBlackBST
构造之后,左倾红黑树图,2-3-4树图分别如下,

从根节点调用deleteMax,
进入moveRedRight,执行colrFlip。产生5-节点

因为,h.left.left == 红色,所以执行 h = rotateRight(h),执行之后,红黑树结构发生变化,当前节点由H-->E。5-节点树完全无变化

接下来,再次执行colorFlip,5-节点被分解,如下

对比,moveRedRight前后的2-3-4图,
首先,当前节点H和右孩子都是2-节点——这是进入moveRedRight的条件
H的左孩子是3-节点,那么moveRedRight就借用左孩子的一个最大节点E,当作自身,把自身H放到右孩子里面,使得右孩子变为3-节点

情形二:进入moveRedRight,且h.left.left==black
以如下顺序构造左倾红黑树树,FBDCGEA,如下图,构造之后没有任何红链,因为没有3-节点,2-3-4图和左倾红黑树图完全一样,所以就不单独画了。

deleteMax,进入moveRedRight之后,第一步colorFlip,2-节点转化为4-节点,如下

因为 h.left.left 不等于 red,所以moveRedRight函数结束。
对比,moveRedRight前后的2-3-4树图,发现,当前节点,左孩子,右孩子都是2-节点,那么将这三个节点转化为4-节点。

总结
进入moveRedRight的条件是,当前节点和右孩子是2-节点。
当左孩子是3-节点时,借一个孩子,转为当前节点,当前节点放到右孩子中;
当左孩子也是2-节点时,三个节点形成一个4-节点。

浙公网安备 33010602011771号