红黑树删除

来源:互联网 发布:虚拟机安装教程mac 编辑:程序博客网 时间:2024/05/22 05:08

红黑树是一种特殊的二叉查找树,其删除结点首先要按二叉查找树删除结点的算法进行

一、普通二叉查找树删除一个结点:

(1)待删除结点没有子结点,即它是一个叶子结点,此时直接删除

(2)待删除结点只有一个子结点,则可以直接删除;如果待删除结点是根结点,则它的子结点变为根结点;如果待删除结点不是根结点,则用它的子结点替代它的位置。

(3)待删除结点有两个子结点,首先找出该结点的后继结点(即右子树中数值最小的那个结点),然后将两个结点进行值交换(即:只交换两个结点的数值,不改变结点的颜色)并将待删除结点删除,由于后继结点不可能有左子结点,对调后的待删除结点也不会有左子结点,因此要把它删除的操作会落入情况(1)或情况(2)中。

二、.红黑树的删除结点算法

  1.待删除结点有两个外部结点,操作如下:

    (1)直接把该结点调整为叶结点

    (2)若该结点是红色,则可直接删除,不影响红黑树的性质,算法结束

    (3)若该结点是黑色,则删除后红黑树不平衡。此时要进行“双黑”操作

            记该结点为V,则删除了V后,从根结点到V的所有子孙叶结点的路径将会比树中其他的从根结点到叶结点的路径拥有更少的黑色结点, 破坏了红黑树性质4。此时,用“双黑”结点来表示从根结点到这个“双黑”结点的所有子孙叶结点的路径上都缺少一个黑色结点。  
双黑含义:该结点需要代表两个黑色结点,才能维持树的平衡

红黑树删除操作 - 枫叶 - 枫叶

图1

   如图1,要删除结点90,则删除后从根结点到结点90的所有子树结点的路径上的黑色结点比从根点到叶结点的路径上的黑结点少。因而,删除结点90后,用子结点NULL代替90结点,并置为“双黑”结点。

2.  待删除结点有一个外部结点,操作为: 
    该节点是黑色,其非空子节点为红色 ;则将其子节点提升到该结点位置,颜色变黑

3.“双黑”结点的处理

分三种情况:(1)双黑色结点的兄弟结点是黑色,且子结点有红色结点

                      (2)双黑结点的兄弟结点是黑色,且有两个黑色结点

                       (3)双黑结点的兄弟结点是红色结点
 
(1)双黑结点的兄弟结点是黑色,且子结点有红色结点
A种情况:双黑结点远侄子结点(双黑结点若为左孩子,则双黑结点的兄弟结点的右孩子为远侄子结点;同理,处理双黑结点为右孩子)为红色,如图2
处理方法:把兄弟结点染为双黑结点的父亲结点的颜色,把兄弟结点的右孩子染为黑色,再把父结点染为黑色;然后针对父结点进行一次左旋转,如科3
红黑树删除操作 - 枫叶 - 枫叶                    红黑树删除操作 - 枫叶 - 枫叶
                        图2                                                                              图3
B种情况:双黑结点近侄子结点(双黑结点若为左孩子,则双黑结点的兄弟结点的左孩子为近侄子结点;同理,处理双黑结点为右孩子)为红,如图4
 处理方法:针对双黑结点的兄弟做一次右旋转,结果使双黑结点的近侄子成为双黑结点新的兄弟;将新兄弟结点着为双黑结点的父结点的颜色,父结点着为黑色,再针对父做一次左旋转,如图5
红黑树删除操作 - 枫叶 - 枫叶红黑树删除操作 - 枫叶 - 枫叶 
                                图4                                                               图5
 (2)双黑结点的兄弟结点是黑色,且有两个黑色结点,如图6
 处理方法:把双黑结点的兄弟结点着为红色,双黑结点的父结点着为黑色;若父结点原来为红色,则算法结束;若父结点原来黑色,则将父结点作为双黑结点,继续调整,如图7
红黑树删除操作 - 枫叶 - 枫叶红黑树删除操作 - 枫叶 - 枫叶 
                        图6                                                                      图7
  (3)双黑结点的兄弟结点是红色结点,如图8
处理方法:单旋转为情况1或情况2,并改变双黑结点的兄弟结点的颜色及父结点的颜色(?????可能不完善),如图9
红黑树删除操作 - 枫叶 - 枫叶红黑树删除操作 - 枫叶 - 枫叶 
                     图8                                                        图9
 
 三、例子
有一棵红黑树12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17,如图10
 
红黑树删除操作 - 枫叶 - 枫叶
                                                                      图10
1.删除结点12
结点12有两个非空子结点,首先调整为叶结点,与其后继结点13进行值交换,然后删除12;由于后继结点为黑色,删除后出现“双黑”,
如图11

红黑树删除操作 - 枫叶 - 枫叶

                           图11
此时,属于第一种情况的A种,处理后结果如图12
红黑树删除操作 - 枫叶 - 枫叶
                                                                 图12
 2.删除1结点
1结点有两个非空子结点,调整为叶子结点,与其后继结点2进行值 交换;此时,1结点只有一个非空子结点,则删除1结点后,将其子结点着为黑色,处理结果如图13
红黑树删除操作 - 枫叶 - 枫叶
图13
 3.删除9
9结点为根结点,调整为叶结点,与后继结点10值交换,由于后继结点为黑色,删除后9后,出现双黑,如图14

红黑树删除操作 - 枫叶 - 枫叶

图14

此时为双黑处理第二种情况,处理后,如图15

红黑树删除操作 - 枫叶 - 枫叶
图15
4.删除结点2
结点2有两个非空子结点,与后继结点3值交换;后继结点为黑色,删除2后,出现双黑;如图16

红黑树删除操作 - 枫叶 - 枫叶

        图16
此时,为双黑处理第二种情况,处理后,如图17

红黑树删除操作 - 枫叶 - 枫叶

图17
5.删除结点0
  结点0为红色结点,直接删除即可
6.删除结点11
结点11有一个非空子结点,为第二种情况,删除11 后,将其非空子结点着为黑色,如图18
 

红黑树删除操作 - 枫叶 - 枫叶

图18
7.删除结点7
结点7有一个非空子结点,也为第二种情况,删除7后,将其非空子结点着为黑色;
8.删除结点19
结点19为叶子结点,且为黑色,删除后出现“双黑”,属于双黑处理的第一种情况,处理后如图19

红黑树删除操作 - 枫叶 - 枫叶

图19

9.删除结点4

 结点4有两个非空子树,与其后继结点5交换;后继结点为黑色,删除4后,出现双黑,此时为双黑处理第二种情况,处理后如图20

红黑树删除操作 - 枫叶 - 枫叶

 图20
10.删除结点15
 结点15为叶子结点,删除后出现“双黑”,此时属于双黑处理第一种情况的B种,处理后如图21

红黑树删除操作 - 枫叶 - 枫叶

 图21
 11.删除结点18
结点18为叶子结点,且为黑色,删除后出现双黑,属于双黑处理的第二种情况,处理后,如图22

红黑树删除操作 - 枫叶 - 枫叶

图22

12.删除结点5

结点5有两个子结点,与其后继结点6交换;交换后,结点5只有一个非空子结点,属于第二种情况,直接删除,将非空子结点着黑色,如图23

红黑树删除操作 - 枫叶 - 枫叶

图23

13.删除结点14

结点14有两个子树,与其后继结点16交换;后继结点为红色,交换后14 为红色,直接删除。

14.删除结点13

结点13为叶子结点,且为黑色,删除后出现“双黑”,属于双黑处理的第二种情况,处理后如图24

红黑树删除操作 - 枫叶 - 枫叶

 图24

15.删除结点10

结点10为根结点,与其后继16值交换;交换后10只有一个非空子结点,直接将10删除,将非空子结点着为黑色

16.删除结点16

结点16为根结点,与后继结点17值交换;交换后16为叶子结点,且为黑色,删除后出现双黑,属于双黑处理的第三种情况,处理后如图25

红黑树删除操作 - 枫叶 - 枫叶

图25

17.删除结点6

结点6为根结点,与后继结点8值交换;交换后,结点6为红色,直接删除

18.删除结点3

结点3为叶子结点,且为黑色,删除后出现“双黑”,属于双黑处理的第二种情况

剩余8,17可类似删除

 

 

0 0
原创粉丝点击