错误:红黑树中的无限循环,因为没有if语句符合条件

时间:2017-04-05 02:20:25

标签: c++

我从这里获得了模板(该网站上的其他人说工作)

Is Red-Black tree balanced

我真的看不到这里的任何问题。我已经看了大约3个小时。无限循环是平衡方法中的主要错误,因为它通过每个if语句而没有找到任何匹配的质量。此外,需要纠正的RBT中的错误是一行中有2个红色节点。

构造

MovieTree:: MovieTree(){

    nil = new MovieNode;
    nil->isRed=false;

    root= nil;
    root->left=nil;
    root->right=nil;

}

添加方法

void MovieTree::addMovieNode(int ranking, std::string title, int year, int quantity){

cout<<title<<" added."<<endl;

if(root == nil){

    root =new  MovieNode(ranking, title, year, quantity);
    root->isRed=false;
    root->left = nil;
    root->right = nil;
    root->parent = nil;
    int b = rbValid(root);
    cout<<b<<endl;
    return;
}



MovieNode *temp = root; //root
MovieNode* parent = nil; //parent


//node is node to add

while(temp != nil){//gets to bottom of tree

    parent = temp;//sets temp to parent of location for where node is added

    if(title < temp->title){
        temp=temp->left;
    }
    else{temp=temp->right;}
}

MovieNode *node;

if(title < parent->title){//adds to either left or right
    cout<<"added to left"<<endl;

    node = new MovieNode(ranking, title, year, quantity);
    node->left = nil;
    node->right = nil;
    node->parent = nil;

    node->isRed=true;

    parent->left = node;
    node->parent=parent;
}

else{
        cout<<"added to right"<<endl;

    node = new MovieNode(ranking, title, year, quantity);
    node->left = nil;
    node->right = nil;
    node->parent = nil;

    node->isRed=true;

    parent->right=node;

    node->parent=parent;
}
int a = rbValid(root);
cout<<a<<endl;
rbAddFixup(node);//seg fault is here

}

平衡方法

void MovieTree::rbAddFixup(MovieNode * node ){

if(node->parent->isRed==true){
    cout<<"parent is red"<<endl;
}

while(node != root && node->parent->isRed==true){

    if(node->parent == node->parent->parent->left){//first event doesn't apply

        MovieNode *uncle = node->parent->parent->right;

        if(uncle ->isRed == true){

            node->parent->isRed=false;//begin rbcase1
            uncle->isRed=false;
            node->parent->parent->isRed=true;//end rbcase1
            node=node->parent->parent;

        }
        else{
            if(node == node->parent->right){

                node=node->parent;
                leftRotate(node);
                node->parent->isRed=false; //case3
                node->parent->parent->isRed=true;
                rightRotate(node->parent->parent);//end case3
            }
        }

    }else{


        MovieNode *uncle = node->parent->parent->left;

        if(uncle ->isRed == true){

            node->parent->isRed=false;
            uncle->isRed=false;
            node->parent->parent->isRed=true;
            node=node->parent->parent;

        }
        else{
//infinite loop happens here
            if(node == node->parent->left){

                node=node->parent;
                rightRotate(node);
                node->parent->isRed=false;
                node->parent->parent->isRed=true;
                leftRotate(node->parent->parent);
            }
        }

}

}
root->isRed=false;

}

1 个答案:

答案 0 :(得分:0)

减少

while(condition1)
{
    if(condition2)
    {
         statements
    } else {
         statement that doesn't affect condition1
         if (condition2)
         {
             statements
         } else {
             // infinite loop happens here
             if (condition3)
             {
                statements
             }
         }
    }
}

问题:

你有一个while循环,它进入一个无法前进的状态。你的评论定位非常好。如果condition1为真且condition3为假,则不会发生任何事情,因此代码永远不会停止。

我非常确定剩下的情况是node == node->parent->right,但我不确定是否可以写它。红黑不对称。