红黑树的删除及其实例



这两天学习了一下红黑树,关于红黑树的资料如下,讲得很详细。

1.    教你透彻了解红黑树:
http://blog.csdn.net/v_JULY_v/archive/2010/12/29/6105630.aspx 

2.     红黑树算法的层层剖析与逐步实现
http://blog.csdn.net/v_JULY_v/archive/2010/12/31/6109153.aspx 

3.    教你彻底实现红黑树:红黑树的c源码实现与剖析
http://blog.csdn.net/v_JULY_v/archive/2011/01/03/6114226.aspx 

4.       具体的插入和删除的例子:

http://saturnman.blog.163.com/blog/static/557611201097221570/

总结几点:

这里我们把当前节点的值改为其后继节点的值,那么真正删除的节点就是其后继节点。

1.       如果没有后继节点,那么这个节点就是真正要删除的节点。

2.       真正要删除的节点是红节点,就直接删除。

3.       真正删除的节点是红节点时,该红节点没有儿子,如果有的话,就要有两个黑儿子,该节点就不是真正要删除

          的。

4.       真正删除的节点是黑节点时,该黑节点没有右儿子,可以有一个左红儿子,也可以没有儿子。

 

删除算法的根本思想是:

将实际需要删除黑节点记为v,该黑节点的父亲节点为pv。那么就需要调整pv,使得其左右子树的黑高度相同,但是这样pv这棵树的黑高度可能会降低,所以要继续向上调整。

我们称这个黑高度变低的子树的根节点为判定点吧,随便取的名字,只是好说而已。当判定点为红色时,直接将其变黑,结束。

 

实际删除节点为黑节点的几种类型:

图中x标记的节点是判定点,表示以该节点为根的子树黑高度减小了1。

黑色为黑节点,灰色为红节点,白色为任意节点。而且图中都假设判定点在右子树上。


1.       红兄弟

(图片来自链接3)

 

 

2.       黑兄弟二黒侄。

(图片来自链接3)

 

3.       黑兄左红侄右黒侄

(图片来自链接3)


4.       黑兄右红侄

(图片来自链接3)


 

 

图中调整后,黑高度又相等了,所以不需要继续向上了。

 

总结几点;        

红兄弟变黑兄弟,

兄侄全黑兄变红,判定点在右子树,

右黑侄变右红侄,判定点在左子树,左黑侄变左红侄。

 

例1:

X标记要该节点要被删除,S标记以该节点为根的子树的黑高度变小了,S标记的点为判定点。

1.       删除节点10,则实际删除的是节点12


 把10与12的值交换


第一步:红兄变黑兄(第1种情况)



第二歩:兄侄全黑兄变红(第2种情况)

此时,节点8没有儿子,相当于有两个黑儿子(黑哨兵)。

 

第三歩:判定节点为红色,直接将其变黑。将X点置为空。结束。

 

例2:删除节点3

 

第一步:兄侄全黑兄变红(第2种情况)

 

步骤二:红兄变黑兄(第1种情况)


第三步:兄侄全黑兄变红(第2种情况)


第四步:兄侄全黑兄变红(第2种情况)


将X点置为空,Over,已经平衡啦。

 

例3:


黑兄,左儿子为空,相当于左黑侄。

步骤一:判定点在右子树,左黑侄变左红侄。(第3种情况)


步骤二:判定点在右子树,有左红侄,第4种情况. Over了。

声明:不要轻信我写的哦~~自己推理一下~~如有不同,欢迎讨论。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值