红黑树伪码冗余

Posted

技术标签:

【中文标题】红黑树伪码冗余【英文标题】:Red black tree pseudocode redundancy 【发布时间】: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 接受第二个参数的父节点并让它指向第三个参数”,不,它接受第三个参数的父节点指向第二个参数。 【参考方案1】:

他们在文本中声明 x 也可以为 Nil,即当 y.right 为 Nil 时。似乎 Nil 在这段代码中也由一个节点表示,他们不想留下一个悬空指针。

【讨论】:

啊,我明白了!灯泡。当他们说他们将利用 T.nil 节点具有左、右和父属性的事实时,这就是他们的意思。谢谢! 只是为了澄清一下,T.nil 是代表树中所有叶子节点的节点。没有它,你会有 O(2^h) nil 叶子,这是浪费空间。 T.nil 的属性 left、right 和 parent 是任意的。所以当 x = y.right 时,如果 x = T.nil,那么 x 的父级将不是 y。如果最后一次调用 RB-DELETE-FIXUP(T, x) 才能正常工作,则需要将其设置为 y。

以上是关于红黑树伪码冗余的主要内容,如果未能解决你的问题,请参考以下文章

C++红黑树

红黑树介绍与实现

红黑树介绍与实现

红黑树介绍与实现

数据结构之红黑树

红黑树(C++实现)