【问题标题】:Not getting correct coloring of Red Black Tree nodes没有得到正确的红黑树节点着色
【发布时间】:2018-05-15 20:11:05
【问题描述】:

我终于想出了如何成功地将项目插入到我的红黑树中而不会出现任何分段错误,但是,我的节点着色已关闭。

我正在尝试按以下顺序将以下值插入到树中:4 3 2 6 5 1

当我打印出 InOrder 树时,我得到以下信息:1-R 2-B 3-B 4-R 5-R 6-B

什么时候我应该得到:1-R 2-B 3-B 4-R 5-B 6-R

这是我的InsertFixUp 函数:

void RBTree::RBInsertFixUp(RBNode* z){
RBNode* y;

if(z == RBTree::root){
    root->color = 'B';
}else{
    while(z->parent->color == 'R'){
        if(z->parent == z->parent->parent->left){
            y = z->parent->parent->right;


        if(y->color == 'R'){
            z->parent->color = 'B';                 //Case 1 Check
            y->color = 'B';                         //Case 1 Check
            z->parent->parent->color = 'R';         //Case 1 Check
            z = z->parent->parent;                  //Case 1 
        }else{

                if(z == z->parent->right){
                    z = z->parent;                  //Case 2
                    RBLeftRotate(z);                //Case 2 Look at Rotate
                }
                z->parent->color = 'B';             //Case 3 Check
                z->parent->parent->color = 'R';     //Case 3 Check
                RBRightRotate(z->parent->parent);   //Case 3 Look at Rotate
            }
        }else{
            y = z->parent->parent->left;

            if(y->color = 'R'){                     
                z->parent->color = 'B';             //Case 1 Check
                y->color = 'B';                     //Case 1 Check
                z->parent->parent->color = 'R';     //Case 1 Check
                z = z->parent->parent;              //Case 1  

            }else{

                if(z = z->parent->left){
                    z = z->parent;                  //Case 2
                    RBRightRotate(z);               //Case 2 Look at Rotate
                }
                z->parent->color = 'B';             //Case 3 Check
                z->parent->parent->color = 'R';     //Case 3 Check 
                RBLeftRotate(z->parent->parent);    //Case 3 Look at Rotate
            }
        }
    }

    root->color = 'B';
}

这是我的左右旋转:

void RBTree::RBLeftRotate(RBNode* x){
    RBNode* y = x->right;
    x->right = y->left;
    y->left->parent = x;
    y->parent = x->parent;

    if(x->parent == RBTree::Tnil){
        root = y;
    }else if(x == x->parent->left){
        x->parent->left = y;
    }else{
        x->parent->right = y;
    }

    y->left = x;
    x->parent = y;
}

void RBTree::RBRightRotate(RBNode* x){
    RBNode* y = x->left;
    x->left = y->right;
    y->right->parent = x;
    y->parent = x->parent;

    if(x->parent == RBTree::Tnil){
        root = y;
    }else if(x == x->parent->right){
        x->parent->right = y;
    }else{
        x->parent->left = y;
    }
    y->right = x;
    x->parent = y;
}

从我所看到的一切来看,我的着色是正确的,我的旋转也是正确的,但也许我错过了一些东西。关于为什么我的着色会关闭的任何帮助都会很棒。

【问题讨论】:

  • 我能看到的一切 - 但你看到了什么?您是否逐步完成插入并观看每项作业?或者添加日志记录?您必须努力调试代码,而不仅仅是盯着源代码说“看起来不错”。

标签: c++ class red-black-tree


【解决方案1】:

在非red-uncle路径的第二次旋转中(她来自z->parent是左子分支):

RBRightRotate(z->parent->parent);   //Case 3 Look at Rotate

您正在祖父节点处旋转,但如果 z 和 z->parent 具有不同的方向,则 z 已经上移一级。

我建议将整个非红叔路径设为以下(父是右子路径留给你):

if(z == z->parent->right)
        RBLeftRotate(z->parent);
    else
        z = z->parent;

    z->color = 'B';
    z->parent->color = 'R';
    RBRightRotate(z->parent);

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2020-10-03
    • 2014-01-13
    • 2017-03-02
    • 1970-01-01
    • 2020-11-29
    • 2011-04-23
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多