您的位置:首页 > 其它

算法导论 红黑树 节点删除

2011-03-03 13:40 323 查看
RB-DELETE-FIXUP:
需要执行Fixup的大前提是:被删除节点y是黑节点。

先说一下删除节点时可能违背的特点。
特点一:节点或红或黑。不违背。
特点2:根节点是黑节点。当被删除的节点是黑节点,而新的根节点是红节点时,违背特点2。不过处理很简单,由于x节点是红节点,在Fixup函数中不执行while循环,直接执行最后的赋值,也就是简单地将x涂为黑。
特点3:叶节点为黑。不违背。
特点4:红节点的子节点为黑。当p[y]和x同为红节点时会违背这个特点。同特点2。
特点5:同一点不同路径黑节点数量相同。这个一定会违背,因为删除y这个黑节点到,就是少了一个黑结点。这种情况是Fixup函数主要应对的。
前四个特点已经讨论完毕,下面重点说一下第五个。对于第五个特点,由于x和p[y]同为黑节点(循环条件),删除y后,为了不违背特点5,我们可以把y的黑色属性加到y的非空子节点x,使之成为双重黑节点。这不违背特点5,但却违背了特点1。因此,最重要解决的是如何不违背特点1。采用的思想是,想办法将双重节点的颜色去掉一重,而又不违背5个特点。

算法RB-DELETE-FIXUP分4种情况:
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*



Case2和4是最终步骤,所以先要将1,3转换为2或4,。还有一点要注意,就是在case2对应的图上,节点B是红节点,而算法的最后要将该节点涂为黑,这在图上没有显示。
整个算法执行过程中,依据的原则就是特点5。可以看到,在四个图所画子树的跟节点到任一外节点α,β,γ,δ,ε,ζ的黑色高度始终不变。说α,β,γ,δ,ε,ζ并不严谨,移位它们很可能是非空子树,不过道理是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: