CLRS红黑树删除

问题描述

我也基于this实现,从Clrs章节中的红黑树上复制了伪代码删除根节点时,我复制的代码无法正常工作(修复前根节点没有更改,我认为这是由于移植错误所致),我不知道为什么。

RBTNode* Custom_Delete(RBTNode* tree,RBTNode* z) {
    RBTNode *x,*y;
    y = z;
    int y_og_color = y->color;

    if (z->left == NIL){
        x = z->right;
        transplant(tree,z,z->right);
    } else if (z->right == NIL){
        x = z->left;
        transplant(tree,z->left);
    } else {
        y = RBTreeMinimim(z->right);
        y_og_color = y->color;
        x = y->right;
        if (y->parent == z){
            x->parent = y;
        } else {
            transplant(tree,y,y->right);
            y->right = z->right;
            y->right->parent = y;
        }
        transplant(tree,y);
        y->left = z->left;
        y->left->parent = y;
        y->color = z->color;
    }
    if (y_og_color == BLACK) {
        RBTreeDeleteFixUp(tree,x);
    }
    return y;
}

void transplant(RBTNode* root,RBTNode* u,RBTNode* v)
{
    if (u->parent == NIL)
        {root = v;}
    else if(u == u->parent->left)
        {u->parent->left = v;}
    else
        {u->parent->right = v;}
    v->parent = u->parent;
}
@H_404_4@

解决方法

代码本身没有错误,I've just passed root pointer to transplant() incorrectly。应该为void transplant(RBTNode* &root,RBTNode* u,RBTNode* v),以便根指针在delete()中被调用后实际上可以更改。