红黑树学习下篇

本篇讲述红黑树的删除,学完前面的三篇,应该发现红黑树真的很经典,删除是最复杂的的,也是最能考验一个人的逻辑思维能力的,我比较笨,学了大半天才搞明白怎么回事,好几处都搞蒙了,所以,我写这一篇的时候会把我自己的心得写一下,免得后学的童鞋和我一样多走一些绕绕。

1,介绍几个此篇中使用到的概念:

Z指向需要删除的节点,Y指向实质结构上被删除的结点,x指向顶替y的节点,w为x的兄弟节点,其中Y是Z的后继节点。

2,红黑树删除操作步骤:

    step1:找到要删除的节点,并删除它。

    step2:对树进行调整使得树满足红黑树的要求。

3,理论:

二叉查找树删除步骤:
    1.如果该节点不存在非空子节点,则直接删除它。
    2.如果该节点存在一个非空子节点,则用其非空子节点替换其位置即可。
    3.如果该节点有两个非空子节点,则可以找到该节点的者后继,然后更换两个节点的元素值,再将后继当做被删除的节点(由于任意一个节点的后继都必定至多只有一个非空子节点,因而删除这样的节点就可以按照前两种情形进行处理)。

删除后红黑树性质的影响:
    如果Z节点只有一个子节点或没有子节点,那么Y就是指向Z指向的节点。如果Z节点有两个子节点,那么Y指向Z节点的后继节点,而Z的后继节点绝对不可能有左子树。因此,仅从结构来看,二叉树上实质被删除的节点最多只可能有一个子树。

删除节点后红黑性质遭到破坏的情况:
    ①如果Y指向的节点是个红色节点,那么直接删除掉Y以后,红黑性质不会被破坏。操作结束。
    ②如果Y指向的节点是个黑色节点,那么就有几条红黑性质可能受到破坏了。
       首先是包含Y节点的所有路径,黑高度都减少了一(第5条被破坏)。

       其次,如果Y的有红色子节点,Y又有红色的父节点,那么Y被删除后,就出现了两个相邻的红色节点(第4条被破坏)。

       最后,如果Y指向的是根节点,而Y的子节点又是红色的,那么Y被删除后,根节点就变成红色的了(第2条被破坏)。

其中,第5条被破坏是让我们比较难受的。因为这影响到了全局。这样动作就太大太复杂了。而且在这个条件下,进行其它红黑性质的恢复也很困难。所以我们首先解决这个问题:如果不改变含Y路径的黑高度,那么树的其它部分的黑高度就必须做出相应的变化来适应它。所以,我们想办法恢复原来含Y节点的路径的黑高度。做法就是:无条件的把Y节点的黑色,推到它的子节点X上去。(X可能是NIL节点)。这样,X就可能具有双重黑色,或同时具有红黑两色,也就是第1条性质被破坏了。(这个很重要)
 
红黑树根据性质的影响,采取了类似二叉查找树的思路:
    1.如果节点z有两个非空子节点,则找到节点z的后继,然后记要删除的元素y=z的后继。
    2.否则只要z有一个非空子节点或者不存在非空子节点,就记要删除的元素z=y
    3.记变量x为y的第一个非空子节点(先检查左孩子,后检查右孩子),如果y的两个孩子都为空,则记x为空
    4.如果y和z不同,则将y的内容拷贝到z
    5.删除节点y
    6.如果被删除节点y的颜色为红色,则删除结束,否则从节点x处开始对删除节点后的红黑树进行调整。 
其中,y为红色直接删除的原因:
    •y是红色的,因而它不是根
    •y是红色的,它的父节点必然是黑色的,因而删除它不会引入两个红色的连续节点
    •y是红色的,而且它至多有一个非空子节点,因而删除它不会导致红黑树的任意路径上的黑节点数目变化

 

4,删除操作图解:

第一:先看最简单情况:删除红色节点。删除红色节点,不影响红黑树平衡性质,直接删除即可,如图:

                    

注意:以下几种单支情况在平衡的红黑树中不可能出现。

因为上述的情况,红黑树处于不平衡状态。(破坏到null,黑色节点数目相同)所以平衡状态下红黑树要么单支黑-红,要么有两个子节点。

第二:删除单支黑节点

        

对于删除y节点后,x替换了y的位置,这样x子树相对于兄弟节点w为根的子树少了一个黑节点,影响平衡,需要进行调整。剩下的调整工作就是将x子树中找一合适红色节点,将其置黑,使得x子树与w子树达到平衡。若x为红色,直接将x置为黑色,即可达到平衡;

   

 

若x为黑色,则分下列几种情况发的:

      情况1:x的兄弟w为红色,则w的儿子必然全黑,w父亲p也为黑。

     

       改变p与w的颜色,同时对p做一次左旋,这样就将情况1转变为情况2,3,4的一种。

 

      情况2:x的兄弟w为黑色,x与w的父亲颜色可红可黑。

      

       因为x子树相对于其兄弟w子树少一个黑色节点,可以将w置为红色,这样,x子树与w子树黑色节点一致,保持了平衡。

      new x为x与w的父亲。new x相对于它的兄弟节点new w少一个黑色节点。如果new x为红色,则将new x置为黑,则整棵树平衡。否则,

      情况2转换为情况1,3,4

      情况3:w为黑色,w左孩子红色,右孩子黑色。

     

       交换w与左孩子的颜色,对w进行右旋。转换为情况4

 

       情况4:w为黑色,右孩子为红色。

      

        交换w与父亲p颜色,同时对p做左旋。这样左边缺失的黑色就补回来了,同时,将w的右儿子置黑,这样左右都达到平衡。

参考博客:

1:http://blog.csdn.net/haidao2009/article/details/8078155
2:http://blog.csdn.net/ningtaohaha123/article/details/39991043
3:http://blog.csdn.net/goodluckwhh/article/details/12718233

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值