删除二叉搜索树中的节点中的 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 = NULL
时,仅将参数设置为 NULL
,而不将成员变量设置为成员变量。
root
的其他赋值也存在问题,它们只会分配给局部参数而不是成员变量。
我认为,您所做的修复(在调用函数中分配给root
)是最正确的解决方案。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 抛出的 Visual Studio 异常:写入访问冲突。q_deck->p_deck 0x110112。C 语言
- Visual Studio图形调试器引发读取访问冲突异常
- 在Visual Studio Community中使用glfw3 glew和opengl获取访问冲突异常
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"
- 删除二叉搜索树中的节点中的 Visual Studio 中的访问冲突异常
- 访问冲突c++ visual studio类
- Visual Studio 2010的访问冲突
- ..处的首次机会异常:读取位置时发生访问冲突..当使用Visual Studio 2010进行调试时
- visual studio 2010-C++中出现访问冲突错误
- Visual Studio 在修改传递到函数中的指针时C++访问冲突
- Visual Studio 2012下奇怪的ifstream访问冲突