【发布时间】:2015-10-29 06:23:04
【问题描述】:
我有这个删除函数,它将 BST 中的一个节点作为参数来删除它。它在做任何事情之前检查三种情况:
- 如果节点没有子节点 - 则删除节点
- 如果节点有一个子节点 - 只需将节点替换为子节点
- 如果节点有两个子节点 - 在右树中找到最小的节点,将其替换为我们要删除的节点(实质上是删除它),然后删除我们找到的最小节点
前两种情况有效,但最后一种情况有两个孩子。只是这种情况的代码如下
AccNode* smallest = pointer->getRight();
bool foundSmallest = false;
// Find the smallest node in the right branch
while (foundSmallest == false) {
if (smallest->getLeft() == NULL && smallest->getRight() == NULL) {
foundSmallest = true;
} else {
if (smallest->getLeft() == NULL && smallest->getRight() != NULL) {
smallest = smallest->getRight();
} else {
smallest = smallest->getLeft();
}
}
}
// Replace the node we want to delete with the data in
// smallest node we found and delete smallest node in that tree
pointer->setData(smallest->getData());
delete smallest;
为了进一步调试,Xcode 有一些非常酷的工具可以让你可视化树,我发现了一些非常有趣的东西。在我们到达delete smallest; 行之前,树中最小的节点如下所示
我们删除后的行是这样的
那么这里发生了什么?我使用指针的方式是否搞砸了?
编辑:我刚刚意识到一些事情。在树后删除的图像中,在折叠部分中,右侧节点不再为 NULL 并且现在具有价值。我打开它,它是我们想要从头开始删除的节点的整个右分支(所以是原始指针的右分支)。所以我觉得我现在肯定对指针做错了。有什么线索吗?
【问题讨论】:
-
所以问题是某些数据在您删除后发生了变化?没关系。即使你不再拥有它,你也不能指望它是一样的。
-
在关于它的答案已经发布后回滚更改代码的编辑。 @SteppingHat:请不要在发布答案后更改问题的任何方面。您可以修改问题,但不要更改。