学习 《算法导论》第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
多谢!