【发布时间】:2022-07-07 11:44:40
【问题描述】:
删除操作是二叉搜索树中最复杂的操作,因为它需要考虑多种可能性:
- 被删除的节点是叶子节点
- 被删除的节点只有一个子节点
- 被删除的节点既有左子又有右子
前两种情况很简单。但是对于第二个,我看了很多书或文档,解决方法是:在右子树中找到最小值,并将其替换为已删除的节点。然后从右子树中删除。
我完全可以理解这个解决方案。
其实一般情况下,右子树中取最小值的节点称为该节点的Successor。所以上面的解决方案是用它的后继值替换被删除的节点。并从子树中删除后继节点。
另一方面,每个节点的前驱是左子树中具有最大值的节点。
我认为,用其前身替换已删除的节点也应该可行。
比如《C语言的数据结构与算法分析》一书中的例子。
如果我们要删除节点“2”。然后我们将其替换为 "2" 的继任者 "3"。
我认为,将“2”替换为“2”的前身“1”也可以。正确的?但是书上根本没谈过。
那么这里有什么约定吗?如果经过一次删除操作,有两个结果都正确。如何保持一致?
编辑:
根据对此问题的新了解进行更新。事实上,《c 中的数据结构和算法分析》一书讨论了这个问题。总结如下:
- 首先,这两种方法(基于后继或前任)都应该有效。
- 如果在树上重复 O(n^2) 插入/删除对。并且所有的删除操作都是基于后继的。然后树将变得不平衡。因为该算法使左子树比右子树更深。这个想法可以用以下两张图片来说明:
然后介绍了平衡搜索树的概念,如AVL树。
【问题讨论】: