运行BST删除时出现异常。以下是我的代码段:
Bst::node * Bst::del(node *root, int num)
{
if (root == NULL)
{
return root;
}
else if (num < root->data)
{
root->left = del(root->left, num);
}
else if (num > root->data)
{
root->right = del(root->right, num);
}
else
{
if (root->left == NULL)
{
node * tmp = root;
root = root->right;
delete tmp;
}
else if (root->right == NULL)
{
node * tmp = root;
root = root->left;
delete tmp;
}
else if (root->left == NULL && root->right == NULL)
{
delete root;
root = NULL;
}
else
{
node *tmp = root;
tmp = findMin(root->right);
root->data = tmp->data;
root->right = del(root->right, tmp->data);
}
}
return root;
}
void Bst::del(int num)
{
del(root, num);
}
当我删除其他节点时,一切正常,但当我删除根节点本身时,函数void Bst::del(int num)
从函数Bst::node * Bst::del(node *root, int num)
获取垃圾值。当我将函数重写为
void Bst::del(int num)
{
root = del(root, num);
}
问题1。当我删除中间节点或除根节点以外的任何其他节点时,为什么它可以正常工作。调试时我发现,当函数Bst::node * Bst::del(node *root, int num)
正在执行时,甚至root被正确删除但是当调用返回到void Bst::del(int num)
时,root的值没有被保留并且是垃圾。
问题2:为什么在将返回值存储在变量root
中时错误得到修复?
答案 0 :(得分:2)
在使用递归删除BST节点时,您必须跟踪正确执行的根节点
root->left = // ...
和root->right = ...
然而,当解除堆栈后调用到达调用者时,root可能会被修改(当你删除root本身时)
此希望回答您的两个问题