二叉搜索树递归删除
Binary Search Tree Recursive Remove
当我试图找到移除函数的最大值时,我的程序一直在中断。我要做的是用左树的最大值覆盖用户想要删除的节点,然后删除该节点。一旦到达第一个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;
}
问题很可能在这里:while(max->data < max->right->data) max = max->right;
您正在耗尽树(max->right
最终将变为NULL)。实际上,由于它是一个二叉搜索树,所以不需要比较data
。只要有可能向右走就够了:while (max->right) max=max->right;
还要注意这个分支中的最后一个赋值:还有两个额外的问题。首先,您应该执行root->left = Premove(...)
而不是max = Premove(...)
(否则您将无法修改根->左引用)。其次,您应该为root->left
调用Premove
,而不是root
: root->left = Premove(root->left, max->data);
(否则您只是得到一个无限递归)。
我认为你的while语句应该是这样的:
while(max && max->right && max->data < max->right->data )
在某些情况下,在您的代码中,max
或max->right
可能是NULL
,这会导致运行时错误。
相关文章:
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- C++删除/(递归)对象销毁问题
- 在c++中使用递归从字符串中删除所有辅音
- 如何递归删除Qt3DWindow根实体中的所有节点?
- 递归树遍历/分支删除的隔离错误
- 以递归方式从链表中删除节点
- 如何使用 Boost Hana 删除元编程递归
- 如果 x,递归不起作用,我的函数只能删除第一个元素
- 编写递归算法以从链表中删除元素.编写递归算法以将元素添加到链表中
- 递归删除预处理器宏
- 从链接列表(通过递归)中删除元素
- 递归模板参数删除
- 不太清楚为什么我的递归链表删除函数有效?我很想解释一下
- 是否可以从此函数中删除递归
- 如何使用递归删除二叉搜索树中的节点
- 如何在没有递归的情况下删除链接列表
- C++无法在递归中删除对象的常量
- 如何在visual C++2013上递归删除二叉树
- 共享指针递归地删除递归数据结构,堆栈溢出