当为 BST 中的节点删除寻找后继者时,是否可以有两个答案?

jef*_*low 3 algorithm search binary-search-tree data-structures

以下面的BST为例:

示例 BST

如果我理论上要删除根(15),我发现不同的来源给了我两种不同的方法来寻找后继者。

  • 情况 1:取右孩子的最左边的值(15 的后继= 16)
  • 情况2:取左孩子最右边的值(15的前导=13)

两者都在适当的班次后返回有效的 BST,但是有更正确的答案吗?或者这两个答案在技术上都是正确的?

我是从我的算法类的主要概念角度提出这个问题的,但是如果从实现的角度来看每种方法有任何优点,我也很想知道!

gch*_*hen 5

两者之间没有区别(两种方法都是正确的并且具有相同的复杂性),并且决定使用哪种方法纯粹是实现决策。

当我们删除一个具有左子树和右子树的父节点(例如15)时,为了保持BST属性(其左侧的所有节点都小于父节点,而其右侧的所有节点都大于父节点),情况 1 和情况 2(如您提到的前驱和后继)是我们可以替换父节点的仅有的两个节点(使所有其他节点成为父节点将无法满足 BST 属性)。

除非你的 BST 有一些特殊的结构,例如,如果你的 BST 左侧总是有较少的节点,那么向下遍历右子树并获取最左边的子树会更有效。然而,对于一般的 BST 来说没有区别。