在二进制搜索树中删除节点时 Visual Studio 中的访问冲突异常
Access Violation Exception in Visual Studio in Deletion of node in Binary Search Tree
当 运行 BST Deletion
时出现异常。
下面是我的代码片段:
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中,错误得到修复?
假设您有一个名为 root
的成员变量,那么问题可能是因为您在删除函数中使用参数 root
隐藏了成员变量 root
。所以当你在函数中做root = NULL
时,你只是将参数设置为NULL
而不是成员变量
root
的其他赋值也有问题,它只会赋给局部参数而不是成员变量。
我认为您所做的修复(在调用函数中分配给 root
)是最正确的解决方案。
当 运行 BST Deletion
时出现异常。
下面是我的代码片段:
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中,错误得到修复?
假设您有一个名为 root
的成员变量,那么问题可能是因为您在删除函数中使用参数 root
隐藏了成员变量 root
。所以当你在函数中做root = NULL
时,你只是将参数设置为NULL
而不是成员变量
root
的其他赋值也有问题,它只会赋给局部参数而不是成员变量。
我认为您所做的修复(在调用函数中分配给 root
)是最正确的解决方案。