红黑树 删除

来源:互联网 发布:js定时刷新页面 编辑:程序博客网 时间:2024/06/07 07:52

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

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

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

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

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

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

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

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

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

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

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

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

图1

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


3.“双黑”结点的处理

分三种情况:

                       (1)双黑结点的兄弟结点是红色结点

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

                       (3)双黑色结点的兄弟结点是黑色,且子结点有红色结点

(1)双黑结点的兄弟结点是红色结点

处理方法:把父节点染成红色,兄弟节点染成黑色,然后对当前节点的父节点进行左旋,重新进入算法。

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

处理方法:从当前节点和兄弟节点中抽取一重黑色追加到父节点,把父节点当成新的当前节点,重新进入算法。

(3)双黑色结点的兄弟结点是黑色,且子结点有红色结点    
A情况:双黑结点近侄子结点(双黑结点若为左孩子,则双黑结点的兄弟结点的左孩子为近侄子结点;同理,处理双黑结点为右孩子))为红色。
处理方法:把兄弟节点染红,近侄子节点染黑,然后以兄弟节点为支点进行右旋,重新进入算法。

B情况:双黑结点远侄子结点(双黑结点若为左孩子,则双黑结点的兄弟结点的右孩子为远侄子结点;同理,处理双黑结点为右孩子)为红色。
处理方法:把兄弟节点染成当前父节点的颜色,把当前节点的父节点染成黑色,远侄子节点染成黑色,然后以当前节点的父节点为支点进行左旋,并把当前节点x指向旋转后树的根节点,算法结束,所有性质调整正确。


插入过程

插入顺序为:12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17

插入节点12:为根节点 

 

插入节点1:父节点为黑色,结束

插入节点9:父节点为红色,叔父节点为黑色,LR,case2+case3

插入节点2:父节点为红色,叔节点为红色,case1

插入节点0:父节点为黑色,结束

插入节点11:父节点为黑色,结束

插入节点7:父节点为红色,叔节点为红色,case1

插入节点19:父节点为黑色,结束

插入节点4:父节点为红色,叔父节点为黑色,RL,case2+case3

插入节点15:父节点为红,叔父节点为红,case1

插入节点18:父节点为红,叔父节点为黑,LR,case2+case3

插入节点5:父节点为红,叔父节点为红,case1

父节点为红,叔父节点为红,case1

插入节点14:父节点为红,叔父节点为红,case1

插入节点13:父节点为红,叔父节点为黑,LL,case3

插入节点10:父节点为黑,结束

插入节点16:父节点为红,叔父节点为红,case1

父节点为红,叔父节点为黑,RL,case2+case3

插入节点6:父节点为红,叔父节点为黑,LR,case2+case3

插入节点3:父节点为黑色,结束

插入节点8:父节点为红,叔父节点为红,case1

父节点为红,叔父节点为黑,RR,case3

插入节点17:父节点为红,叔父节点为黑,RR,case3

删除过程

原始红黑树

删除12:用13覆盖12,转换为删除13

自己为黑,兄弟为黑,兄弟左子为黑,右子为红,case4

删除1:用2覆盖1,转换为删除2

自己为黑,当前节点3为红,变黑

删除9:用10覆盖9,转化为删除10

自己为黑,兄弟为黑,兄弟的双子为黑,case2

自己为红,结束

删除2:用3覆盖2,转换为删除3

自己为黑,兄弟为黑,兄弟的双子为黑,case2

自己为红,变黑,结束

删除0:自己为红,结束

删除11:当前节点为红,变黑,结束

删除7:自己为黑,当前节点为红,变黑

删除19:当前节点为黑,兄弟为黑,兄弟的左子为红,case4

删除4,用5覆盖4,转换为删除5

自己为黑,兄弟为黑,兄弟双子为黑,case2

自己为红,变黑,结束

删除15:自己为黑,兄弟为黑,兄弟的右子为黑,左子为红,case3+case4

删除18:自己为黑,兄弟为黑,兄弟的双子为黑,case2

自己为红,变黑,结束

删除5:用8覆盖5,转换为删除8

自己为红,结束

删除14:用16覆盖14,转换为删除16

自己为红,结束

删除13:自己为黑,兄弟为黑,兄弟的双子为黑,case2

自己为黑,兄弟为黑,兄弟的双子为黑,case2

删除10:用16覆盖10,转换为删除10

自己为黑,当前节点为红,变黑

删除16:用17覆盖16,转换为删除17

自己为黑,兄弟为红,case1

自己为黑,兄弟为黑,兄弟的双子为黑,case2

删除6:用8覆盖6,转化为删除8

自己为红,结束

删除3:自己为黑,兄弟为黑,兄弟的双子为黑,case2

删除8:当前节点为红,变黑,结束

删除17:结束





另外一篇关于红黑树 添加、删除的链接:http://hi.baidu.com/coolinc/item/c2073dc375dfe8bd0c0a7bf6
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 本地连接2没有了怎么办 电脑上找不到本地连接怎么办 网络无访问权限怎么办 电脑无网络访问怎么办 xp连不上网怎么办 xp系统本地连接不见了怎么办 电脑xp系统本地连接怎么办 xp系统本地连接失败怎么办 xp系统找不到本地连接怎么办 台式电脑连不上网络怎么办 win7局域网要密码怎么办 xp网络不能上网怎么办 台式电脑连宽带怎么办 win7宽带813错误怎么办 电脑不显示本地连接怎么办 w7宽带连接不了怎么办 网络接收器坏了怎么办 电脑网页打开慢怎么办 win10无法添加打印机怎么办 2018杭州禁摩怎么办 中山个人怎么办社保卡 昆山房产证丢了怎么办 于一机交宽带费怎么办 租房子的怎么办宽带 乐才注册不了怎么办 分期乐登录不了怎么办 股票忘记交易密码怎么办 信用卡交易密码忘记怎么办 乐购超市怎么办会员 手机分期付款0首付怎么办 首付手机违约了怎么办 买了假东西怎么办 pk10滚雪球挂了怎么办 好彩投彩票闪退怎么办 yeezy买小了怎么办 yeezy斑马变黄了怎么办 yeezy买大了怎么办 聚宝商城被骗怎么办 电瓶车碟刹抱死怎么办 电动车分期不还怎么办 车壳子凹进去怎么办