algorithm - 红黑树伪代码冗余

标签 algorithm red-black-tree clrs

在算法第三版简介中,他们有一个红黑树删除的伪代码实现。这是...

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!他们为什么要这样做?

这是他们的解释......

“When y's original parent is z, however, we do not want x.p to point to y's original parent, since we are removing that node from the tree. Because node y will move up to take z's position in the tree, setting x.p to y in line 13 causes x.p to point to the original position of y's parent, even if x == T.nil.”

所以他们想让 x 的父级保持为 y...它已经是 y...

最佳答案

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

关于algorithm - 红黑树伪代码冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5739730/

相关文章:

algorithm - 红黑树删除算法

c++ - 为什么将排序的键插入 std::set 比插入打乱的键快得多?

algorithm - 红黑树插入案例

c - 我创建过程 Rand(a,b) 的方法的更好解决方案,使用过程 Rand(0,1)

c++ - 递归矩阵乘法

c - 快速排序运行时速度问题

algorithm - 递归求解两个字符串之间的公共(public)最长子串

algorithm - 动态规划和分而治之

algorithm - 如何将点分成两组 - 轮廓的上部和下部

algorithm - 计算 n 为 nlog(n) 和 n!当时间为 1 秒时。 (算法需要 f(n) 微秒)