【问题标题】:CLRS Red-Black Tree deletionCLRS 红黑树删除
【发布时间】:2021-01-03 08:27:36
【问题描述】:

我从关于红黑树的 CLRS 章节复制了伪代码,同样基于 this 实现。我复制的代码在删除根节点时无法正常工作(修复之前根节点没有改变,我认为这是由于移植错误造成的),我不知道为什么。

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;
}

【问题讨论】:

    标签: c red-black-tree clrs


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-23
      • 2016-08-03
      • 2021-10-17
      • 2014-07-05
      • 1970-01-01
      • 2011-03-27
      • 2012-11-01
      相关资源
      最近更新 更多