c - 红黑树插入节点报错

标签 c insertion red-black-tree

我正在尝试在红黑树中插入节点。函数 rotate_left、rotate_right、insertion 是正确的,但 rb_fixup 似乎是错误的。红色显示为 1,黑色显示为 0。我已经从 CLRS 实现了算法。当插入第三个元素时,它会出现段错误。 rb_fixup 的代码是:

struct node
{
    int data;

    int color;
    struct node *left;
    struct node *right;
    struct node *parent;
}*root;


rb_fixup(struct node *z)
{

    struct node *y;
    y=(struct node *)malloc(sizeof(struct node));
    while(z->parent->color==1)
    {
        if(z->parent==z->parent->parent->left)
        {
            y=z->parent->parent->right;
            if(y->color==1)
            {
                z->parent->color=0;
                y->color=0;
                z->parent->parent->color=1;
                z=z->parent->parent;
            }
            else if(z==z->parent->right)
            {
                z=z->parent;
                rotate_left(z);
            }
            z->parent->color=0;
            z->parent->parent->color=1;
            rotate_right(z->parent->parent);

        }
        else if(z->parent==z->parent->parent->right)
        {
            y=z->parent->parent->left;
            if(y->color==1)
            {
                z->parent->color=0;
                y->color=0;
                z->parent->parent->color=1;
                z=z->parent->parent;
            }
            else if(z->parent->left==z)
            {
                z=z->parent;
                rotate_right(z);
            }
            z->parent->color=0;
            z->parent->parent->color=1;
            rotate_left(z->parent->parent);
        }
    }
    root->color=0;
}

最佳答案

我解决了上面的问题。上面代码的错误在于,如果叔叔是红色的,它会将叔叔和 parent 涂成黑色,将祖 parent 涂成红色,但它会继续执行在每个条件的 else if 之后编写的操作许多条件没有正确完成。最终代码如下所示:-

rb_fixup(struct node *z)
{

    struct node *y;
    y=(struct node *)malloc(sizeof(struct node));
    while(z->parent->color==1 && z->parent!=NULL)
    {
        if(z->parent==z->parent->parent->left)
        {
            if(z->parent->parent->right!=NULL)
            y=z->parent->parent->right;
            if(y->color==1)
            {
                z->parent->color=0;
                y->color=0;
                z->parent->parent->color=1;
                z=z->parent->parent;
            }
            else if(z==z->parent->right)
            {
                z=z->parent;
                rotate_left(z,z->right);
                z->parent->color=0;
                z->parent->parent->color=1;
                rotate_right(z->parent->parent,z->parent);
            }
            else
            {
                z->parent->color=0;
                z->parent->parent->color=1;
                rotate_right(z->parent->parent,z->parent);
            }
        }
        else 
        {
            if(z->parent->parent->left!=NULL)
            {
                y=z->parent->parent->left;
            }           
            if(y->color==1)
            {
                z->parent->color=0;
                y->color=0;
                z->parent->parent->color=1;
                z=z->parent->parent;                
            }
            else if(z==z->parent->left)
            {
                z=z->parent;
                rotate_right(z,z->left);
                z->parent->color=0;
                z->parent->parent->color=1;
                rotate_left(z->parent->parent,z->parent);
            }
            else
            {
                z->parent->color=0;
                z->parent->parent->color=1;
                rotate_left(z->parent->parent,z->parent);
            }
        }
    }
    root->color=0;
}

关于c - 红黑树插入节点报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30815850/

相关文章:

C预处理器#if表达式

c - 预序二叉搜索树插入

python - 插入红黑树

java - JAVA中基于红黑树实现TreeMap的说明

c - 为什么C要在<math.h>中定义M_2_SQRTPI常量?

c - 使用 free() 释放动态内存

c - 与 MPI 相关的 'cluster' 软件的作用是什么?

C++:从键和值 vector 插入 boost::unordered_map

perl - 在匹配文本之前插入新的文本行

algorithm - 解释为什么插入(以及不同的情况)不会改变红黑树的黑色高度