CLRS红黑树删除

时间:2020-09-16 13:31:56

标签: c red-black-tree 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, 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, z, 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;
}

1 个答案:

答案 0 :(得分:1)

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

相关问题