[英]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也被正确删除Bst::node * Bst::del(node *root, int num)
但是当调用返回到void Bst::del(int num)
根的价值没有得到保留,是垃圾。
问题2:为什么将返回值存储在变量root中时,错误会得到解决?
假设您有一个名为root
的成员变量,那么问题可能是因为您在删除函数中用参数root
屏蔽了成员变量root
。 因此,当您在函数中执行root = NULL
时,仅将参数设置为NULL
而不将成员变量设置为。
root
的其他分配也存在问题,它们只会分配给局部参数,而不是成员变量。
我认为,您所做的修复(在调用函数中分配为root
)是最正确的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.