从二叉搜索树中删除
Removing from a Binary Search Tree
我正在尝试从二叉树函数中删除。我有点迷茫,所以我正在尝试逐案处理它,从我尝试删除的值是否在 BST 的根目录中开始。为了测试我的函数,我首先调用一个打印树所有内容的 printcontent() 函数,然后调用 remove(8) [8 是目前根中的值),然后再次调用 printcontent()。我这样做的方法是尝试用树左侧的"最右侧"值替换根。当我第二次调用 printcontent 时,它会正确打印新的根值,但是当它继续打印内容并达到该值曾经所在的点时,它有一个随机的长数"-572......"(虽然我认为数字不重要)然后我的程序崩溃了。我看到我的根的值被替换了,但之后会发生什么?
这是我的删除函数:
void BinarySearchTree::remove(int value) {
Node* tmp = head;
Node* tmp2 = head;
if (head->data == value && head->left != NULL) {
tmp=tmp->left;
while (tmp->right != NULL) {
tmp=tmp->right;
}
while (tmp2->right->right != NULL) {
tmp2=tmp2->right;
}
if (tmp->left == NULL) {
head->data = tmp->data;
tmp2->right = NULL;
delete tmp;
}
if (tmp->left != NULL) {
head->data = tmp->data;
tmp2->right = tmp->left;
delete tmp;
}
}
它显然是不完整的,但我正在测试它只处理根被移除并替换为树左侧最右侧值的情况(假设有一个左侧,有),我觉得从逻辑上讲它应该工作,所以也许是当我"删除 tmp"时出现问题。我不知道是否有必要发布我的整个程序,但如果有必要,请告诉我!
我可以建议,与其写出root,不如像CLRS中处理的那样对待这种情况:这是两种不同的情况。1. 当要删除的节点是叶子时2. 当要删除的节点是非叶节点时(在这种情况下,将其替换为无序的后继/前置节点)。
根删除显然属于第二种情况。这只是一个建议。
相关文章:
- 删除二叉搜索树 (C++) 中的单个元素
- 二叉搜索树 - 使用 Linux 在虚拟机中制作删除功能
- 删除节点方法实际上不会删除二叉搜索树中的节点.C++
- C++ 从二叉搜索树中删除具有两个子节点的特定节点
- 在二进制搜索树中删除节点
- 如何从二进制搜索树中删除节点
- 从C++二进制搜索树中删除一个节点(类而非结构)
- 从基于矢量的二叉搜索树中删除节点的最佳方法
- C++ 通过无序变量删除二叉搜索树
- 二叉搜索树删除 (C++)
- 二叉搜索树查找和删除 [C++]
- 无法从二进制搜索树中删除叶子
- 在C++中为二叉搜索树创建一个删除函数
- 从二叉搜索树中删除值
- 删除二叉搜索树的 fcn
- 如何使用递归删除二叉搜索树中的节点
- 二进制搜索树删除而无需复制
- 很难从我的二进制搜索树中删除一个节点
- 二进制搜索树 - 删除节点,没有指向前任的指针
- 从二进制搜索树中删除只有一个孩子的节点