Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++_Recursion_Binary Search Tree - Fatal编程技术网

C++ 二叉搜索树递归删除

C++ 二叉搜索树递归删除,c++,recursion,binary-search-tree,C++,Recursion,Binary Search Tree,当我试图找到删除函数的最大值时,我的程序不断中断。我试图做的是用左树的最大值覆盖用户想要删除的内容,然后删除该节点。一旦到达第一个位置,它就会不断地破裂。这种递归让我心碎。我的缺点在哪里 这是带有私有递归同级的remove函数 template<typename TYPE> bool BinarySearchTree<TYPE>::remove(TYPE& data) { bool found = search(dataOut); if(found

当我试图找到删除函数的最大值时,我的程序不断中断。我试图做的是用左树的最大值覆盖用户想要删除的内容,然后删除该节点。一旦到达第一个位置,它就会不断地破裂。这种递归让我心碎。我的缺点在哪里

这是带有私有递归同级的remove函数

template<typename TYPE>
bool BinarySearchTree<TYPE>::remove(TYPE& data)
{
    bool found = search(dataOut);
    if(found)
        TRoot = Premove(TRoot, data);
    return found;
}

template<typename TYPE>
Node<TYPE>* BinarySearchTree<TYPE>::Premove(Node<TYPE>* root, TYPE& data)
{
    Node<TYPE>* del;
    Node<TYPE>* max;
    if(root)
    {
        if(root->data > data)
            root->left = Premove(root->left, data);
        else if(root->data < data)
            root->right = Premove(root->right, data);
        else
        {
            if(root->left && root->right)
            {
                max = root->left;
                while(max->data < max->right->data)
                    max = max->right;
                root->data = max->data;
                max = Premove(root, max->data);

            }
            else
            {
                del = root;
                root = (root->right) ? root->right : root->left;
                delete pDel;
            }
        }
    }
    return root;
}
模板
bool二进制搜索树::删除(类型和数据)
{
bool found=搜索(数据输出);
如果(找到)
TRoot=预移动(TRoot,数据);
发现退货;
}
模板
节点*二进制搜索树::Premove(节点*根、类型和数据)
{
节点*del;
节点*max;
如果(根)
{
如果(根->数据>数据)
根->左=预移动(根->左,数据);
else if(根->数据<数据)
root->right=Premove(root->right,数据);
其他的
{
如果(根->左&&根->右)
{
最大=根->左;
同时(最大->数据<最大->右->数据)
max=max->right;
根->数据=最大->数据;
max=Premove(根,max->data);
}
其他的
{
del=根;
根=(根->右)?根->右:根->左;
删除pDel;
}
}
}
返回根;
}

问题很可能出在这里:
while(max->dataright->data)max=max->right

您正在用完树(
max->right
最终将变为NULL)。 实际上,由于它是一个二叉搜索树,因此不需要比较
数据
。只要在可能的情况下向右走就足够了:
while(max->right)max=max->right


还要注意这个分支中的最后一个任务:还有两个额外的问题。首先,您应该执行
root->left=Premove(…)
而不是
max=Premove(…)
(否则您将不会修改root->left引用)。其次,对于
root->left
调用
Premove
,而不是
root
root->left=Premove(root->left,max->data)(否则您将得到无限递归)。

我认为您的while语句应该是这样的:

while(max && max->right && max->data < max->right->data ) 
while(max&&max->right&&max->dataright->data)

在某些情况下,在您的代码中,
max
max->right
可能是
NULL
,并导致运行时错误。

您能描述一下“中断”是什么意思吗?(关于代码,而不是你的头脑)好吧,这似乎很好,但当我试图删除
max
时,它进入了一个无限循环。