【发布时间】:2011-08-10 00:43:51
【问题描述】:
在算法第三版的介绍中,他们有一个红黑树删除的伪代码实现。在这里……
RB-DELETE(T, z)
y = z
y-original-color = y.color
if z.left == T.nil
x = z.right
RB-TRANSPLANT(T, z, z.right)
elseif z.right == T.nil
x = z.left
RB-TRANSPLANT(T, z, z.left)
else
y = TREE-MINIMUM(z.right)
y-original-color = y.color
x = y.right
if y.p == z
x.p = y // <--------- why????
else
RB-TRANSPLANT(T, y, y.right)
y.right = z.right
y.right.p = y
RB-TRANSPLANT(T, z, y)
y.left = z.left
y.left.p = y
y.color = z.color
if y-original-color == BLACK
RB-DELETE-FIXUP(T, x)
TREE-MINIMUM 只求树中的最小值,RB-TRANSPLANT 取第二个参数的父节点,指向第三个参数,第三个参数的父节点是第二个参数的父节点。
根据我的评论,他们测试 y.p 是否为 z,如果是,则将 x.p 设置为 y。但是 x 已经是 y.right,所以这就像说 y.right.p = y,但是 y.right.p 已经是 y!他们为什么要这样做?
这是他们的解释...
“但是,当 y 的原始父节点是 z 时,我们不希望 x.p 指向 y 的原始父节点,因为我们正在从树中删除该节点。因为节点 y 将向上移动以占据 z 在树中的位置,所以在第 13 行将 x.p 设置为 y 会导致 x.p 指向 y 的父节点的原始位置,即使 x == T.nil。”
所以他们想让 x 的父级保持为 y...它已经是 y...
【问题讨论】:
-
对于“RB-TRANSPLANT 接受第二个参数的父节点并让它指向第三个参数”,不,它接受第三个参数的父节点指向第二个参数。
标签: algorithm red-black-tree clrs