Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 异常:删除二叉搜索树中的节点_C++_Algorithm_Tree_Binary Search Tree - Fatal编程技术网

C++ 异常:删除二叉搜索树中的节点

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删除时遇到异常。下面是我的代码片段:

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);
        }