二叉搜索 删除目标节点的树有两个子节点
Binary Search Tree deletion of target node has two children
这是我的代码,替换是正确的(用左子树中最大的节点替换目标节点),但是替换后,左右子树都消失了。
这是我的代码:
else if (temp->left != NULL && temp->right != NULL)
{
minLeaf = temp->left;
minLeafMa = temp->left;
parentRight = parent->right;
while (minLeaf->right != NULL)
{
minLeafMa = minLeaf;
minLeaf = minLeaf->right;
}
if (parent->left == temp)
{
parent->left = minLeaf;
minLeafMa->right = NULL;
}
else if (parent->right == temp)
{
parent->right = minLeaf;
minLeafMa->right = NULL;
}
}
删除具有 2 个子节点x
的正确方法是找到x
的无序successor
或predecessor
,将x
的值替换为predecessor
或successor
的值,并对其中任何一个调用删除(无论您使用哪个)。
您在此处使用predecessor
。你正在做
parent->left = minLeaf;
它将父节点的左侧指向叶节点(predecessor
节点),导致两者之间的所有节点都消失。相反,你应该做的是
temp->data = minLeaf->data;
并在minLeaf
上递归调用删除。
相关文章:
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 比较两个节点坐标的最佳方法是什么?
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 比较C++中两个BST的节点
- 给定两个字符串 S 和 T.确定与 T 相差最小的 S 子字符串?
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- 如何在单个链表中交换两个节点的位置,只修改指针
- 如何遍历具有两个节点的链接节点
- 是否可以使一个类成为两个不同层次结构的子类?
- 查找C++中两个索引之间的子字符串
- 子数组中两个数字的相同出现(连续)
- 查找树中两个节点之间的最大成本边
- 添加一个节点,并在通用树中的两个给定节点之间找到路径成本,其中c 中的儿童列表
- 使用位于 C 字符串中的两个字符*获取子字符串
- 难以通过具有两个类和一个 LLL 的头节点
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- 如何解决数独问题,以便通过交换任何两个相邻的子网格,我仍然得到有效的答案?
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 与子字符串相比,两个字符串集之间的相交