正在删除二进制搜索树中具有两个子节点的节点
Deleting node with two children in binary search tree
我正试图删除一个有两个子节点的节点。然而,我的功能并不是从树中完全删除节点,而是留下一个重复节点。
以下是我的功能:
void Remove(Node *&r, int idx)
{
if(Search(r, idx))
{
if(idx < r->id) Remove(r->left, idx);
else if(idx > r->id) Remove(r->right, idx);
else DeleteNode(r);
//cout << "Account " << idx << " is now closed.";
}
else cout << "Account does not exist." << endl;
}
void DeleteNode(Node *&r)
{
Node *temp = r;
if(r->left == NULL && r->right != NULL)
{
r = temp->right;
delete temp;
temp = NULL;
}
else if(r->left != NULL && r->right == NULL)
{
r = temp->left;
delete temp;
temp = NULL;
}
else if(r->left == NULL && r->right == NULL)
{
r = NULL;
delete r;
}
else
{
// go to left of r and find largest value
temp = FindMax(r->left);
int tempID = temp->id;
float tempBal = temp->balance;
string tempString = temp->name;
DeleteNode(temp);
r->id = tempID;
r->balance = tempBal;
r->name = tempString;
}
}
Node* FindMax(Node *t)
{
while(t->right != NULL)
{
t = t->right;
}
return t;
}
假设我有这棵树:
33
22 44
11 25
删除22
会导致以下情况:
33
22 44
22 25
temp = FindMax(r->left);
不是你想做的。当你DeleteNode(temp)
时,旧节点仍然在树中,但temp
被覆盖了。您打算覆盖父级的right
成员。
相关文章:
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 比较两个节点坐标的最佳方法是什么?
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 比较C++中两个BST的节点
- 给定两个字符串 S 和 T.确定与 T 相差最小的 S 子字符串?
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- 如何在单个链表中交换两个节点的位置,只修改指针
- 如何遍历具有两个节点的链接节点
- 是否可以使一个类成为两个不同层次结构的子类?
- 查找C++中两个索引之间的子字符串
- 子数组中两个数字的相同出现(连续)
- C++ 链表合并排序的实现在连接 1 个以上节点的子列表时失败
- 查找树中两个节点之间的最大成本边
- 添加一个节点,并在通用树中的两个给定节点之间找到路径成本,其中c 中的儿童列表
- 使用位于 C 字符串中的两个字符*获取子字符串
- 难以通过具有两个类和一个 LLL 的头节点
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- 链接列表C 类,这两个添加节点实现之间的差异是什么?
- 有没有办法在两个ROS节点之间具有优先级