【问题标题】:Binary Search Trees / Picking a Root二叉搜索树/选择根
【发布时间】:2017-03-09 16:36:48
【问题描述】:

我不太确定如何为二叉搜索树选择根(我希望不使用任何代码):

5、9、2、1、4、8、3、7、6

如何选择根?

这个算法的步骤让我很困惑。

【问题讨论】:

  • 当你说“这个算法”时,你脑海中是否有一个特定的算法? (我问是因为没有一种众所周知的选择根的方法。)

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


【解决方案1】:

您可以初始化一个空的 BST(二叉搜索树),然后迭代列表并插入每个项目。

您无需选择根,只需构建树即可。但也许你想要平衡树,你可以将列表的中间值作为第一个元素插入,但正确的答案是使用平衡二叉搜索树(AVL 树)。

【讨论】:

    【解决方案2】:

    中位数将是更好的选择,因为您希望深度更小。 下面是一个例子,根是求中位数,下一个也是求中​​位数

                     5 
              3             8
        2         4       7    9
     1                  6          
    

    5 是由 (1+9)/2 得到的。 3 get from ceiling(1+4)/2 (也可以选择中位数的下限作为选择中位数根的作用)

    【讨论】:

      【解决方案3】:

      具有相同值的 BST 可以有多种形式。例如,包含 1,2 的树可以是:

      1  <- root
       \
        2  <-- right son
      

          2  <- root
         /
        1  <-- left son
      

      所以你可以有一棵树,其中 1 是根,它是 1->2->3... 并且没有左子。您可以将 5 作为根,分别将 4 和 6 作为左右子,并且您可以拥有许多其他具有相同值但排序不同(可能是不同的根)的树

      【讨论】:

        【解决方案4】:

        如何选择根?

        随心所欲。任意数量的数据都可以作为根。


        您希望选择中位数,在本例中为 5。通过该选择,您的树应该尽可能平衡,5 左侧的四个节点和 5 的右子树中的四个节点。

        请注意,any 元素可能是 rood(甚至是随机选择,或者您示例中的第一个数字)。


        嗯,那我为什么要担心找到中位数而不总是选择第一个数字(最简单的选择)?

        因为您希望二叉搜索树 (BST) 尽可能平衡

        如果您选择最小或最大数字作为根,那么您的树将达到其最大深度(最坏情况),并将模拟单个链表,这将导致搜索算法出现最坏情况也是。然而,正如 Michel 所说,为根选择最小或最大项不一定会导致退化树。例如,如果您为根选择了最小项,但包含其余项的右分支是平衡的,则树的高度仅比最佳值高一级。如果您按升序或降序选择节点,则只会得到一棵退化树。

        请记住,在 BST 中,必须遵守此规则:

        左子节点小于父节点并且 所有正确的子节点都大于父节点。


        更多信息,请阅读How binary search tree is created??

        【讨论】:

        • 为根选择最小或最大项不一定会导致退化树。例如,如果您为根选择了最小项,但包含其余项的右分支是平衡的,则树的高度仅比最佳值高一级。如果您按升序或降序选择节点,您只会得到一棵退化树。
        • 太棒了@JimMischel,我同意,希望你现在更喜欢我的回答!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        相关资源
        最近更新 更多