【发布时间】:2010-12-01 02:24:42
【问题描述】:
我目前正在尝试在 C++ 中实现 AVL 树,到目前为止,除了删除节点之外,我已经完成了几乎所有工作。
1) 有人可以确认我删除节点的算法是正确的吗?
- 在树中找到要删除的节点
- 如果节点有0个子节点:删除节点
- 否则,如果节点有 1 个子节点:删除节点,然后重新链接他的子节点
- else (2 children):找到它的后继节点,并将要删除的节点与其后继节点交换。然后重复这些步骤以删除节点(现在是其后继节点所在的位置)。
- 插入后重新平衡树(它会递归地重新平衡树...)
我已经这样做了,但我不确定的部分是我删除节点的步骤。我是否还必须删除对节点的引用,否则它将被管理? (因为我在参数中传入了一个Node*&,但是后继者只是函数中的一个Node*...)
我不确定我是否非常清楚,如果您需要更多详细信息,请告诉我。
(我会发布一些代码,但不幸的是我会说法语,所以我猜你不会从中理解太多)
【问题讨论】: