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-节点。

 

posted @ 2019-03-09 18:04  leondryu  阅读(392)  评论(0)    收藏  举报