【问题标题】:Deletion operation in Binary Search Tree: successor or predecessor二叉搜索树中的删除操作:后继或前驱
【发布时间】:2022-07-07 11:44:40
【问题描述】:

删除操作是二叉搜索树中最复杂的操作,因为它需要考虑多种可能性:

  • 被删除的节点是叶子节点
  • 被删除的节点只有一个子节点
  • 被删除的节点既有左子又有右子

前两种情况很简单。但是对于第二个,我看了很多书或文档,解决方法是:在右子树中找到最小值,并将其替换为已删除的节点。然后从右子树中删除。

我完全可以理解这个解决方案。

其实一般情况下,右子树中取最小值的节点称为该节点的Successor。所以上面的解决方案是用它的后继值替换被删除的节点。并从子树中删除后继节点。

另一方面,每个节点的前驱是左子树中具有最大值的节点。

我认为,用其前身替换已删除的节点也应该可行。

比如《C语言的数据结构与算法分析》一书中的例子。

如果我们要删除节点“2”。然后我们将其替换为 "2" 的继任者 "3"。

我认为,将“2”替换为“2”的前身“1”也可以。正确的?但是书上根本没谈过。

那么这里有什么约定吗?如果经过一次删除操作,有两个结果都正确。如何保持一致?

编辑

根据对此问题的新了解进行更新。事实上,《c 中的数据结构和算法分析》一书讨论了这个问题。总结如下:

  • 首先,这两种方法(基于后继或前任)都应该有效。
  • 如果在树上重复 O(n^2) 插入/删除对。并且所有的删除操作都是基于后继的。然后树将变得不平衡。因为该算法使左子树比右子树更深。这个想法可以用以下两张图片来说明:

然后介绍了平衡搜索树的概念,如AVL树。

【问题讨论】:

    标签: binary-search-tree


    【解决方案1】:

    我可以说理论,对我来说你的论点似乎是正确的,一个人可以采取前任或继任者。

    现在在实践中,我认为最好的决定是保持树平衡,并根据深度最低的两个选项在两个选项之间切换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多