C++ 二叉搜索树递归删除
当我试图找到删除函数的最大值时,我的程序不断中断。我试图做的是用左树的最大值覆盖用户想要删除的内容,然后删除该节点。一旦到达第一个位置,它就会不断地破裂。这种递归让我心碎。我的缺点在哪里 这是带有私有递归同级的remove函数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
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
时,它进入了一个无限循环。