当我尝试找到删除功能的最大值时,我的程序一直在断开。我要做的是用最大的左树覆盖用户想要删除的内容,然后删除该节点。它一旦到达第一个Else就会一直破碎。递归打破了我的想法。哪里是我的缺点?
这是具有私有递归兄弟的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;
}
答案 0 :(得分:2)
问题很可能在这里:
while(max->data < max->right->data) max = max->right;
你的树用完了(max->right
最终会变为NULL)。
实际上,由于它是二叉搜索树,因此无需比较data
。只要尽可能走到右边就足够了:while (max->right) max=max->right;
另请注意此分支中的最后一项任务:还有两个问题。首先,您应该max = Premove(...)
代替root->left = Premove(...)
(否则您将不会修改root-&gt;左参考)。其次,您应该Premove
为root->left
而不是root
:root->left = Premove(root->left, max->data);
(否则您只能获得无限递归)。
答案 1 :(得分:0)
我认为你的while语句应该是这样的:
while(max && max->right && max->data < max->right->data )
在您的代码中的某些情况下,max
或max->right
可能是NULL
,这会导致run_time错误。