C++ 异常:删除二叉搜索树中的节点
我在运行BST删除时遇到异常。下面是我的代码片段:C++ 异常:删除二叉搜索树中的节点,c++,algorithm,tree,binary-search-tree,C++,Algorithm,Tree,Binary Search Tree,我在运行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);
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)
从函数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=…
但是,当调用在展开堆栈后到达调用方时,根可能会被修改(删除根本身时的情况)
希望这能回答你们两个问题这是什么类型的BST?我不知道是否有不同类型的BST。我只知道在BST中,左元素应该比根小,右元素应该比根大。@Giraffe船长:歪斜BST@CaptainGiraffe1->2->3->4我无法想象这种行为。一切正常,但当我有1,2,3,4并且试图删除1时,只有根删除会产生问题。我想我需要
root=
来保存返回的值。否则,返回根代码>不去任何地方..我说的有道理吗?@tanz如果你把它写在纸上,然后去做,你会得到它的。它基本上到达最后一个,递归到输入1,2,3,4的右子树。。如果我试图删除1,它将只是根节点。我认为不会发生任何递归。它只是转到else部分,然后返回。更像是正则函数。请在这里帮助我。@tanz好的,它会转到findMin
其他部分,用右子树中的min替换root
,即root->right数据,现在将递归到该子树中,并删除其中的根,如果适用,在展开时,您将获得新的root
,这里很难解释,用简单的例子写笔记本和铅笔
void Bst::del(int num)
{
root = del(root, num);
}