学习 《算法导论》第13章 红黑树 总结三

学习 《算法导论》第13章 红黑树 总结三

今天把这编博客写完吧,这里学习红黑树的删除操作,前面学习了
红黑树的定义及旋转
红黑树的插入操作

红黑树的删除操作也要结合二叉查找树的删除操作来学习。

在一棵n个结点的红黑树中删除一个结点也是一样的,要花O(lgn)的时间,删除操作比插入还要复杂!!!!

删除也分为两步:第一步,当成二叉查找树处理,删除一个结点;第二步,修复红黑树的性质;

第一步:删除结点

第一步:删除结点的算法

 1 if left[z] = nil[T] or right[z] = nil[T]    
 2    then y ← z    
 3    else y ← TREE-SUCCESSOR(z)    
 4 if left[y] ≠ nil[T]    
 5    then x ← left[y]    
 6    else x ← right[y]    
 7 p[x] ← p[y]    
 8 if p[y] = nil[T]    
 9    then root[T] ← x    
10    else if y = left[p[y]]    
11            then left[p[y]] ← x    
12            else right[p[y]] ← x    
13 if y ≠ z    
14    then key[z] ← key[y]    
15         copy y's satellite data into z    
16 if color[y] = BLACK    
17    then RB-DELETE-FIXUP(T, x)    
18 return y  

额,又是这么高大上的算法,这里比TREE-DELETE算法多了16, 17行。若删除的结点y是黑色的,则要保持红黑树的性质;若删除的结点y是红色的,则y被删除后,红黑性质仍然保持,理由如下:
1. 树中各结点的黑高度都没有变化
2. 不存在两个相邻的红色结点
3. 若y是红色的,就不肯是根,所以根依然是黑色的。

第一步:删除结点的C语言实现

这里写代码片

第二步:修复

“修复情况看起来有些复杂,下面我们用一个分析技巧:我们从被删节点后来顶替它的那个节点开始调整,并认为它有额外的一重黑色。这里额外一重黑色是什么意思呢,我们不是把红黑树的节点加上除红与黑的另一种颜色,这里只是一种假设,我们认为我们当前指向它,因此空有额外一种黑色,可以认为它的黑色是从它的父节点被删除后继承给它的,它现在可以容纳两种颜色,如果它原来是红色,那么现在是红+黑,如果原来是黑色,那么它现在的颜色是黑+黑。有了这重额外的黑色,原红黑树性质5就能保持不变。现在只要恢复其它性质就可以了,做法还是尽量向根移动和穷举所有可能性。”–saturnman。

未完待续!!!

参考文档

http://blog.csdn.net/v_JULY_v/article/details/6105630

http://blog.csdn.net/v_JULY_v/article/details/6114226

多谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值