这是一个修复红黑树的函数,但编译器一直给出l值必须是可修改的,' z'在while循环条件导致问题(z!= root)时,while应该r.un直到指向特定键的z指针到达键“' z'指针指向
void Tree::fixup(int z)
{
fixuppri(root, z);
}
void Tree::fixuppri(node* root, int a)
{
node* z ;
z = returnnode(a);
while (z != root && z->parent->color = 'r')
{
node* y;
if (z->parent == z->parent->parent->left)
{
y = z->parent->parent->right;
}
else
{
y = z->parent->parent->left;
}
if (y->color = 'r')
{
z->parent->parent->color = 'r';
z->parent->color = 'b';
y->color = 'b';
z = z->parent->parent;
}
else
{
if (z->parent == z->parent->parent->left && z == z->parent->left)
{
char tempcolor = z->parent->color;
z->parent->color = z->parent->parent->color;
z->parent->parent->color = tempcolor;
rightrotate(z->parent->parent);
}
if (z->parent == z->parent->parent->left && z == z->parent->right)
{
char tempcolor = z->color;
z->color = z->parent->parent->color;
z->parent->parent->color = tempcolor;
leftrotate(z->parent);
rightrotate(z->parent->parent);
}
if (z->parent == z->parent->parent->right && z == z->parent->right)
{
char tempcolor = z->parent->color;
z->parent->color = z->parent->parent->color;
z->parent->parent->color = tempcolor;
leftrotate(z->parent->parent);
}
if (z->parent == z->parent->parent->right && z == z->parent->left)
{
char tempcolor = z->color;
z->color = z->parent->parent->color;
z->parent->parent->color = tempcolor;
rightrotate(z->parent);
leftrotate(z->parent->parent);
}
}
}
root->color = 'b';
}
答案 0 :(得分:0)
这是一个简单的拼写错误,由于与运算符优先级的交互而导致混淆错误。
你写了=
,你应该写==
。
&&
的优先级低于==
,但优先级高于=
。
这意味着
z != root && z->parent->color = 'r'
相当于
(z != root && z->parent->color) = 'r'
和z != root && z->parent->color
不是可修改的l值。