gpt4 book ai didi

c++ - 异常 : Deletion of node in Binary Search Tree

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:44:49 28 4
gpt4 key购买 nike

运行 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变量中,错误得到修复?

最佳答案

在使用递归删除 BST 节点时,您必须跟踪根节点,您正在这样做是正确的

root->left =//...root->right = ...

然而,当展开堆栈后调用到达调用者时,根可能会被修改(当您删除根本身时)

希望能回答您的两个问题

关于c++ - 异常 : Deletion of node in Binary Search Tree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075777/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com