数据结构(二)--- 红黑树 (3)

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 情况进行处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfdyf.html