【问题标题】:How many traversals need to be known to construct a BST需要知道多少次遍历才能构造一个 BST
【发布时间】:2012-10-04 13:07:50
【问题描述】:

我对不同站点上的许多文章感到非常困惑,这些文章涉及从任何一个遍历(prepostin-order)或其中任何两个的组合构造一个Binary Search Tree。例如,在this 页面,它说给定prepostlevel 顺序遍历,连同in-order 遍历,可以构造BST。但是herethere,它们向我们展示了仅从pre-order 构造一个BST。此外,here 他们向我们展示了如何从给定的prepost-order 遍历构造BST。在其他一些站点中,我找到了一个仅从 post-order 遍历构造 BST 的解决方案。

现在我知道给定inorderpre-order 遍历,可以唯一地形成BST。至于我提供的第一个链接,虽然他们说我们不能从pre-orderpost-order 构造BST,但我不能只对post-order 数组进行排序以获得它的inorder 遍历,并且然后使用它和pre-order 数组形成BST?这与第四个链接中的解决方案相同还是不同?并且仅给定pre-order,我可以对其进行排序以获得in-order,然后使用它和pre-order 获得BST。同样,这必须与链接 2 和 3 的解决方案不同吗?

具体来说,什么足以唯一地生成BST?如果不需要唯一性,那么我可以简单地对其进行排序以获取 in-order 遍历,并从中递归地构建 N 个可能的 BSTs 之一。

【问题讨论】:

    标签: algorithm binary-search-tree inorder postorder preorder


    【解决方案1】:

    要构造一个 BST,您只需要一次(不是按顺序)遍历。

    一般来说,要构建一棵二叉树,您将需要两次遍历,例如顺序遍历和预排序遍历。但是,对于 BST 的特殊情况 - 中序遍历始终是包含元素的排序数组,因此您始终可以重建它并使用算法从前序遍历和中序遍历中重建通用树。

    因此,树是 BST 的信息以及其中的元素(即使是无序的)都等价于中序遍历。

    奖励:为什么对于一般树来说一次遍历是不够的(没有信息,它是 BST)?
    答案:假设我们有 n 不同的元素。这些 n 元素有 n! 可能的列表,但是 - 树的可能数量要大得多(2 * n!n 个元素的可能树都是腐烂的树,因此每个节点中都有 node.right = null,因此树实际上是右侧的列表。有 n! 这样的树,还有另外 n! 棵树,总是 node.left = null ) 因此,根据鸽子洞原理 - 至少有一个列表生成 2 棵树,因此我们不能从一次遍历中重建树。 (QED)

    【讨论】:

    • 所以第 2 和第 3 链接的解决方案生成唯一可能的 BST?
    • @Cupidvogel:我没有遵循那里的代码 - 但如果它是正确的,那么是的。每次预购遍历只有一个 BST。
    • 然后查看geeksforgeeks.org/archives/6633的文章。他们从prein-order 遍历构造了一个BST。但是考虑到可以单独从pre-order 构造树,你不认为这段代码中需要二分查找来查找位置会降低效率吗?根本不使用inorder,而只使用pre-order 来构造树不是更有效吗?但是,这两种解决方案一定会产生相同的树吗?
    • @Cupidvogel:中序+前序遍历解决方案是构造一个,它不一定是BST。 BST 是一种特定情况,其中顺序是隐式已知的并且可以使用。假设这两种解决方案都是正确的 - 获取预排序并按顺序调用最后一个算法将产生与调用第一个算法相同的树(仅预排序)。
    • @Nawaz pigeonholes:排列组合。每个排列都是一个鸽巢。有n!那些。鸽子:所有具有 n 个独特元素的不同树(相同 n)。有X > n! 这样的树。让f:trees->permutations 成为任何映射函数。由于|trees| > |permutations|,有一些x!=y 这样f(x) = f(y)(鸽洞原理)。这意味着,仅给定f(x),您不能唯一构造导致f(x) 的树,因为它可能是xy。我希望这很清楚,如果此解释缺少任何关键细节,请告诉我。
    【解决方案2】:

    如果给定 BST 节点的值,则只需遍历一次就足够了,因为其余数据由节点的值提供。但是,如果这些值是未知的,那么根据我的理解,不可能从一次遍历中构建一个唯一的 BST。不过,我愿意接受建议。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多