【问题标题】:Can a binary search tree be constructed from only the inorder traversal?可以仅从中序遍历构造二叉搜索树吗?
【发布时间】:2021-09-25 20:19:15
【问题描述】:

想检查是否有一种方法可以仅从按排序顺序的中序遍历构造二叉搜索树。我在想可能有某种方法我们可以递归地做到这一点,但无法弄清楚。任何指针将不胜感激。

【问题讨论】:

  • 你可以构造a二叉搜索树,但不一定与原来的同构。

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


【解决方案1】:

一个 BST 只有一个有序遍历,但一个给定的有序遍历可以构造多个 BST。因此,是的,可以使用给定的有序遍历构造一个 BST,但您可能不会最终得到您开始按顺序遍历的同一棵树。

查看这篇文章了解更多信息:https://www.geeksforgeeks.org/find-all-possible-trees-with-given-inorder-traversal/

【讨论】:

    【解决方案2】:

    是的,可以从中序遍历构造二叉搜索树。

    观察二叉搜索树的中序遍历总是排序的。

    有许多可能的结果,但人们可能对生成尽可能平衡的树特别感兴趣,以便在其中进行高效搜索。产生低效二叉搜索树的一种方法是在最后插入的节点的右侧不断添加新节点。然后生成的二叉搜索树倾斜

    如果例如中序遍历是 1,2,3,4,5,6,我们会得到这棵树:

     1
      \
       2
        \
         3
          \
           4
            \
             5
              \
               6
    

    这对于二叉搜索树来说不是很有帮助,因为它实际上已经退化为一条链,并且在该树中搜索并不比在输入数组中从左到右执行搜索更好。

    一个更有效的替代方案是这种二叉搜索树,它具有相同的中序遍历:

           3
          / \
         2   5
        /   / \
       1   4   6
    

    算法

    产生相当平衡的二叉搜索树的算法确实可以是递归的:

    1. 如果给定的数组(遍历)为空返回null(emtpy树)
    2. 取给定数组的中间值(遍历)并为其创建一个节点。
    3. 获取所选数组值左侧的子数组,并为其递归执行算法。这将返回一个节点(以子树为根),该节点应作为第 2 步中创建的节点的左子节点附加。
    4. 获取所选数组值右侧的子数组,并为其递归执行算法。这将返回一个节点(以子树为根),该节点应附加为步骤 2 中创建的节点的右子节点。
    5. 返回步骤 2 中创建的节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多