如何解决二叉搜索树的问题删除节点
我正在C ++中实现二进制搜索树,但是代码有一个错误,当删除具有2个子节点的节点时,结果树连接不好,删除具有0个或1个孩子的节点的方法效果很好。此代码基于以下答案:https://stackoverflow.com/a/31698320/11053027。
编辑: 例如,如果a按以下顺序添加值:17、12、25,然后尝试删除作为根的17,则将其删除,因此当我尝试显示所有元素时:12、25,其中25为根。 但是,如果现在我尝试删除12而不是删除,则是在我第一次删除17时引起的问题。没有显示错误消息。
能帮我吗?提前致谢。这是代码:
Node<E> *getSuccesor(Node<E> &node) const {
auto *Succesor = node.right;
while (Succesor != nullptr) {
if (Succesor->left == nullptr) return Succesor;
Succesor = Succesor->left;
}
return Succesor;
}
void remove(Node<E> &node) {
if (&node == nullptr) return;
int nChildren = numChildren(node);
Node<E> *child;
if (nChildren == 2) {
child = getSuccesor(node);
remove(*child);
child->parent = node.parent;
child->left = node.left;
child->right = node.right;
if (&node == root)
root = child;
else {
if (&node == node.parent->right)
node.parent->right = child;
else node.parent->left = child;
}
} else {
child = (node.left != nullptr ? node.left : node.right);
if (child != nullptr)
child->parent = node.parent;
if (&node == root)
root = child;
else {
if (&node == node.parent->left)
node.parent->left = child;
else node.parent->right = child;
}
}
Size--;
}
解决方法
很难确定,因为您还没有给我们minimal complete example,但我认为问题出在这里:
if (nChildren == 2) {
child = getSuccesor(node);
remove(*child);
child->parent = node.parent;
child->left = node.left;
child->right = node.right;
因此,child
现在知道它的子级。但是他们不知道child
现在是他们的父母。他们的parent
指针仍然指向已失效的节点(在本例中为'17'),这将使下次移除时的逻辑混乱。
在这些行之后,添加以下内容:
if(child->left)
child->left->parent = child;
if(child->right)
child->right->parent = child;
编辑:if-else条件语句的另一个分支中也存在相同的错误,但是我敢肯定,您也可以在那里找到解决方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。