您的位置:首页 > 其它

红黑树-删除节点

2018-03-13 23:09 211 查看
红黑树删除步骤分为两个:delete 和 delete-fixup

假定要删除的节点的指针为 node。

移植(Transplant)

删除过程中遇到用某节点u代替某节点v的情况,则调用Transplant(u,v),用来处理好 v 与 u->p 的链接关系。

删除

过程一共有四种情况:

case 1:node只有右子节点。

case 2:node只有左子节点。

case 3:node有两个子节点,且node的后继是node的右子节点。

case 4:node有两个子节点,且node的后继是node的左子节点。

过程涉及的因素有

1. 被删除节点node. node可能是根。

2. node的后继y.

3. y的右子节点x.

4. node的颜色。

5. y的颜色。

删除过程如下,先不考虑违背了哪些性质

预处理, 令 y = node , 用 y-original-color 储存 y的颜色。分情况讨论:

case 1

令x指向node的右子节点,用x代替node。判断是否要fixup.

case 2

令x指向node的左子节点,用x代替node。判断是否要fixup。

case 3&4

令y指向node的后继,储存y的颜色(此时y-original-color是node的后继的颜色)。令x指向y的右子节点。判断是否要fixup。

如果y是node的右子节点。令x->p指向y。算法导论中对此有一段解释:在case 3中,假设 x = y->r = T.NIL, 那么x是个叶节点,这时候需要人工将叶节点NIL的p指针设置为y,在x 非 NIL的情况下 下,这操作不起任何作用。

如果y非node的右子节点。将y从原来的位置剥离开,x代替y的位置。

用y代替node节点,y的与node的子节点的关系完全取代node与node子节点的关系(关系调整)。并把y的颜色设置为node的颜色。

各因素的变化

case 1: y指向node,x指向node的右子节点, y-original-color是node的颜色。

case 2: y指向node,x指向node的左子节点,y-original-color是node的颜色。

case 3: y指向z的后继,x指向y的右子节点,y-original-color是node后继的颜色。

case 4: y指向z的后继,x指向y的右子节点,y-original-color是node后继的颜色。

删除后的分析

我有一个疑问:为什么case 1和2中,会被fixup的是node的子节点,而在case 3和4中,会被fixup的是node的后继的子节点?注意到算法导论中RB-delete()的第20行,将y涂为node的颜色。原本node的颜色也会影响bh,y被剥离,所以y的颜色也会影响bh。y代替了node,将y涂为node的颜色等同于“node没被删除”,故也不用考虑node的颜色的影响。总而言之,4种情况中,都只需考虑一个节点(node的子节点或其后继的子节点)的颜色带来的影响,将这个节点命名为x,对其进行fixup操作。

fixup操作中,也用到转化策略。首先对于给点的节点x,有五种情况

(假定x是其父节点的左节点,当然还有另外的镜像情况)s是x的兄弟。

1. case 0:x是树新的根。

2. case 1:s是红色的。

3. case 2:s是黑色,s的两个子节点都是黑色的。

4. case 3:s是黑色,s的左子节点为红,右子节点为黑。

5. case 4:s是黑色,s的右子节点为红。

fixup采用讲case 1的情况转化为case 2,3 或者4的策略。

case 1 –> case 4

case 1 –> case 2 –> case 4

case 1 –> case 3 –> case 4

当y代替了node后,原本含y的简单路径的黑高减去1;因此要设法使得bh恢复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: