在《算法导论第三版》中,他们提供了红黑树删除操作的伪代码实现。以下是其内容...
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-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了...