R - replace 补位节点,P - parent 父节点,PP - 祖父节点,B - brother 兄弟节点,BL - brother left 兄弟节点左子节点,BR - brother right 兄弟节点右子节点, O - 其他节点
情况1: R 为红色
情况1比较简单,红色节点不影响红黑树的自平衡结构,所以直接补位,并把颜色转换为被删除节点的颜色。
情况2: R 为黑色
2.1、R 为左子节点
2.1.1、R 为黑色且为左子节点,B 为红色(如图 2.1.1)
(1)、将 B 设为黑色
(2)、将 P 设为红色
(3)、对 P 进行左旋,得到 2.1.2.3 情况
(4)、按照 2.1.2.3 情况进行处理
2.1.2、R 为黑色且为左子节点,B 为黑色
2.1.2.1、R 为黑色且为左子节点,B 为黑色,BR 为红色,BL 为任意(如图 2.1.2.1)
(1)、将 B 设为 P 的颜色
(2)、将 P 设为黑色
(3)、将 BR 设为黑色
(4)、对 P 进行左旋
在此处有几个问题,注意上图框出的部分
1、为什么此处不符合自平衡结构?
回答:节点的删除是先找到补位节点(后继节点),然后自平衡处理,然后才进行补位,所以此处的 R 之后会移走的,所以还是符合自平衡结构。
2、BL 可能为黑色节点么?
回答:BL 不可能为黑色节点,但其可能为黑色叶子节点(NULL节点),下边用穷举法进行证明;
我们知道,在节点删除之前(第一次删除),红黑树是保持平衡结构的,那么如果 BL 为黑色,那么有一下几种情况:
1)P 为黑色,BL 为黑色,如下图(1),不平衡,不成立。
2)P 为红色,BL 为黑色,如下图(2),不平衡,不成立。
3)P 为红色,BL 为黑色叶子节点(NULL),如下图(3),平衡,成立。
4)P 为黑色,BL 为黑色叶子节点(NULL),如下图(4),平衡,成立。
5)BL 为红色,如下图(5),平衡,成立。
综上:BL 只可能为红色节点或黑色叶子节点(NULL)。
2.1.2.2、R 为黑色且为左子节点,B 为黑色,BR 为黑色,BL 为红色(如图 2.1.2.2)
(1)、将 B 设为红色
(2)、将 BL 设为黑色
(3)、对 B 进行右旋,得到 2.1.2.1 情况
(4)、按照 2.1.2.1 情况进行处理
2.1.2.3、R 为黑色且为左子节点,B 为黑色,BR 为黑色(NULL),BL 为黑色(NULL)(如图 2.1.2.3)
(1)、将 B 设为红色
(2)、将 P 作为新的补位节点
(3)、重新进行删除节点处理
需要注意:
这时 P 就是 将要被移走的 R 的补位节点(后继节点)。
此种情况下其实 BL,BR 都是黑色的叶子节点(NULL)。
B 变为红色是的原因是整颗子树都是黑色的节点,R 移走后,无论如何操作都没办法在子树内自平衡,所以,最简单的操作把 B 变为红色,这样就自平衡了;但是这样一来 子树内部的黑色节点层数少了一层,这样从 P 子树的上一层数来看就是不平衡的了,所以要将 P 看成新的补位节点,进行自平衡操作,自底向上,直至根节点。
2.2、R为右子节点
2.2.1、R 为黑色且为右子节点,B 为红色(如图 2.2.1)
(1)、将 B 设为黑色
(2)、将 P 设为红色
(3)、对 P 进行右旋,得到 2.2.2.3 情况
(4)、按照 2.2.2.3 情况进行处理