算法导论 红黑树 节点删除

来源:互联网 发布:qq for mac怎么安装 编辑:程序博客网 时间:2024/04/27 22:25

RB-DELETE-FIXUP:

需要执行Fixup的大前提是:被删除节点y是黑节点。

 

先说一下删除节点时可能违背的特点。

特点一:节点或红或黑。不违背。

特点2:根节点是黑节点。当被删除的节点是黑节点,而新的根节点是红节点时,违背特点2。不过处理很简单,由于x节点是红节点,在Fixup函数中不执行while循环,直接执行最后的赋值,也就是简单地将x涂为黑。

特点3:叶节点为黑。不违背。

特点4:红节点的子节点为黑。当p[y]x同为红节点时会违背这个特点。同特点2

特点5:同一点不同路径黑节点数量相同。这个一定会违背,因为删除y这个黑节点到,就是少了一个黑结点。这种情况是Fixup函数主要应对的。

前四个特点已经讨论完毕,下面重点说一下第五个。对于第五个特点,由于xp[y]同为黑节点(循环条件),删除y后,为了不违背特点5,我们可以把y的黑色属性加到y的非空子节点x,使之成为双重黑节点。这不违背特点5,但却违背了特点1。因此,最重要解决的是如何不违背特点1。采用的思想是,想办法将双重节点的颜色去掉一重,而又不违背5个特点。

 

算法RB-DELETE-FIXUP4种情况:

w=brother[x]

Case1:color[w]=red

Case2:color[w]=black,color[left[x]]=black,color[right[w]]=black

Case3:color[w]=black,color[left[x]]=red,color[right[w]]=black

Case4:color[w]=black,color[left[x]]=either,color[right[w]]=red

 

四种情况的关系如下图。

 

1

2*

3

4*

 

Case24是最终步骤,所以先要将1,3转换为24,。还有一点要注意,就是在case2对应的图上,节点B是红节点,而算法的最后要将该节点涂为黑,这在图上没有显示。

整个算法执行过程中,依据的原则就是特点5。可以看到,在四个图所画子树的跟节点到任一外节点α,β,γ,δ,ε,ζ的黑色高度始终不变。说α,β,γ,δ,ε,ζ并不严谨,移位它们很可能是非空子树,不过道理是一样的。