我从这里获得了模板(该网站上的其他人说工作)
我真的看不到这里的任何问题。我已经看了大约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;
}
答案 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
,但我不确定是否可以写它。红黑不对称。