【问题标题】:May binary search tree get broken by rotation?二叉搜索树会被旋转破坏吗?
【发布时间】:2018-04-01 18:43:06
【问题描述】:

我现在正在学习算法,在实现红黑树插入时,我想到了问题标题中描述的想法。这发生在涉及等值节点时。

让我们从一个简单的示例树开始,其中左子节点小于父节点,右子节点大于或等于父节点。

这种树的初始状态可能如下:

然后,如果我向左旋转这棵树,我会得到:

违反BST条件的节点所有左子节点都小于父节点显示为红色。


所以问题是:为什么许多在二叉搜索树上实现插入、删除或其他操作的算法在旋转破坏 BST 时使用旋转(或者我只是做错了旋转)?

【问题讨论】:

  • 不允许重复的树通常具有您描述的条件。允许重复的树通常将其放宽为“所有左孩子都小于或等于”。
  • 如果这个严格的不等式条件存在,那个孩子的等价条件不存在又如何呢?
  • 这棵树只是因为你说它坏了才坏。使用旋转的算法不会有这样的条件。

标签: algorithm data-structures binary-tree binary-search-tree tree-rotation


【解决方案1】:

问题是为什么要在 BST 满足所有条件时轮换它。您的示例中的旋转将不会在任何意义上实现。在“许多算法”中,仅当“插入”或“删除”或“其他”生成违反 BST 属性的新树时才需要旋转。假设您将 6 替换为 8 作为 BST 的根,现在您的轮换将有意义。

【讨论】:

  • 您不应该被这种特殊情况分心,问题仍然存在。想象一下向问题中描述的树添加 8,您必须进行相同的旋转以平衡树。
  • 完美,所以你有一个你想要的旋转平衡树。我提到你的例子只是为了说明一点,当你没有违反你定义的 BS​​T 时,你故意在你的 BST 上进行轮换。它不会发生在任何算法中。
【解决方案2】:

据我所知,大多数教科书通过考虑唯一键来介绍 BST,即:left < root < right。一切都基于此,包括轮换。如何处理重复通常留作练习,没有人说它必须像将不变量更改为 left <= root < right 一样简单。

这样做正是因为您描述的问题:在某些情况下,旋转可能无法“开箱即用”重复。即使您添加重复节点(并且不要在每个节点中存储计数),也可能总有一种方法可以使它们工作,但是不得不提及边缘情况及其解决方案只会分散总体思路涉及旋转的各种树。

所以基本上:

  • 根据您的树,如果您更改教科书的先决条件,旋转可能并不总是按照教科书中描述的“标准”方式工作:如果教科书上写着left < root < right,您不应该假设它的算法也像给定的@那样工作987654324@ 或任何其他前提条件。你可能需要改变一些东西。例如,在 RB 树中,您可能需要在较低级别进行旋转。
  • 如果您不想费心更改任何内容,只需在节点中添加另一个字段,用于计算该节点的键出现的次数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多