如何从二进制搜索树中删除节点
How do I delete a node from a binary search tree
如何实现函数以从二进制搜索树中删除节点?以下是我当前功能:
void makeDeletion(TreeNode *&tree) {
TreeNode *NodeToDelete;
NodeToDelete = tree;
TreeNode *InOrder;
if (tree->right == NULL && tree->left == NULL) {
delete NodeToDelete;
}
if (tree->right == NULL) {
tree = tree->left;
delete NodeToDelete;
}
else if (tree->left == NULL) {
tree = tree->right;
delete NodeToDelete;
}
else {
InOrder = tree->right;
while (InOrder->left != NULL) {
InOrder = InOrder->left;
}
NodeToDelete->value = InOrder->value;
remove(InOrder, InOrder->value);
}
}
这是我所在的remove
函数,它可以找到要删除的值:
void remove(TreeNode *&tree, ANY num) {//Removed Need for ">"
if (tree == NULL){
return;
}
if (tree->value == num) {
makeDeletion(tree);
} else if (num < tree->value) {
remove(tree->left, num);
} else {
remove(tree->right, num);
}
};//Remove
当下我觉得自己非常接近,但是当我去输出二进制树的内容时,程序会崩溃。我正在尝试使用一种方法,如果节点有两个孩子,我找到了秩序的继任者,请交换"删除"的顺序连续节点和节点的值,然后删除后继者。没有调整remove
函数,我缺少哪些信息来使makeDeletion
函数如所述工作?
编辑:在makeDeletion
功能中,我误编写了两个if
语句。第二个if
语句应该是else if
语句。
在 makeDeletion
中,如果 tree
是叶子( left
和 right
均为 NULL
),则删除叶子节点,并且不设置 tree = nullptr
。这给您的树中的悬挂夹引用了已释放的记忆。另外,然后您在下一个if
中取消(现在已删除的)节点。其中任何一个都可以导致您的崩溃。
相关文章:
- 为什么我的删除节点函数实际上没有删除节点?
- 为什么"delete"关键字不删除节点?
- 以递归方式从链表中删除节点
- 根据 Pugixml 中的子值删除节点
- 基于给定字符串数据类型的链表删除节点
- 在双向链表中给定节点之后删除节点
- 如何在单链列表 c++ 中正确删除节点
- 在BST堆中删除节点免错误
- 为什么我的打印功能之一删除节点
- 重载运算符>>从二叉树中删除节点
- 删除节点方法实际上不会删除二叉搜索树中的节点.C++
- C bST删除节点会破坏排序算法
- 删除节点并处理新的 nullptr 和链接节点
- 如何从链表中删除节点
- 如何在用于删除节点的函数中检查我的链表是否C++为空
- 从BST删除节点时出错
- 二叉树,从树中删除节点后将其删除
- 链接列表删除节点C
- 在二进制搜索树中删除节点
- 使用类从双向链表中删除节点