二进制搜索树 - 删除

时间:2014-03-23 06:15:08

标签: algorithm tree binary-search-tree

对于二进制搜索树,为什么我们不能简单地将前一个代替节点有两个孩子的删除情况下的节点的后继者?

2 个答案:

答案 0 :(得分:0)

我们希望删除最小工作量并破坏树结构的节点。

假设我们要从以下树中删除包含6的节点:

enter image description here

标准解决方案基于这个想法:我们将包含6的节点保留在它的确切位置,但是我们除去了值6并找到另一个值存储在{{1}中节点。此值取自6节点下的节点,并且该节点实际上是从树中删除的。

enter image description here

现在,我们可以将什么值移入空出的节点并拥有二叉搜索树?好吧,这里有如何解决这个问题。如果我们选择值X,那么:

  1. 左子树中的所有内容都必须小于X。
  2. 右子树中的所有内容都必须大于X.
  3. 假设我们要从左子树获得X. (2)是有保证的,因为左子树中的所有内容都小于右子树中的所有内容。 (1)怎么样?如果X来自左子树,(1)表示X有一个唯一的选择 - 我们必须选择X作为左子树中的最大值。在我们的示例中,3是左子树中的最大值。因此,如果我们在腾出的节点中放入3并从当前位置删除它,我们将有一个BST,其中6个被删除。

    结果是:

    enter image description here

答案 1 :(得分:0)

为什么我们不能简单地将前一个代替删除节点的后继者 节点有两个孩子的情况?

我们可以将两者都,并且没有必要用inorder后继替换已删除的节点。这是因为在任何一种情况下,都保持了BST的一般合同。

<强>案例1。将删除的节点替换为inorder后继。 这是通过在已删除节点的右子树中找到最左边的节点来完成的。

<强>情况2。将删除的节点替换为inorder previouster。 这是通过在已删除节点的左子树中找到最右边的节点来完成的。

请注意,这两种情况都会使左子树中的所有元素都变小,右子树中的所有元素都大于我们带入已删除节点位置的元素。