【问题标题】:No of trees can be constructed from given Inorder/Preorder/Postorder traversal没有树可以从给定的 Inorder/Preorder/Postorder 遍历构造
【发布时间】:2014-01-24 11:19:53
【问题描述】:

我知道如果没有 Inorder 和 Preorder/postorder 遍历,就无法构造一棵树。因为对于给定的(仅 Inorder/Preorder/postorder),可能会生成更多数量的树。是否有任何算法或机制可以计算给定的唯一树的数量(仅 Inorder/Preorder/postorder 遍历)。

Eg : a b c d e f g this is my Inorder traversal. 

使用给定的中序遍历可以构造多少个独特的树。

我试过他们是谷歌,但没有一个解释清楚

任何帮助将不胜感激......

【问题讨论】:

  • one cannot construct a tree without having both Inorder and Preorder/postorder traversals 这是一个大胆的声明:在 preorder(相当于 postorder) 以及关于它们从左到右的顺序的信息(显式地或按顺序(搜索树)),人们可以明确地重建一棵树。 (想一想,这似乎需要对 二叉树 的限制(用 inorder 暗示)。)
  • (我认为没有两个相等的父子键就足够了——找到一个线性结构看起来很困难。)

标签: algorithm data-structures tree


【解决方案1】:

算法如下:

P(N) 表示带有N 节点的树的数量。设节点索引为1,2,3,...

现在,让我们选择树的根。任何给定的N 节点都可以是根。假设节点i 已被选为根。那么,中序序列中i左边的所有元素都必须在left sub-tree中。同样,在右边。

所以,总的可能性是:P(i-1)*P(N-i)

在上述表达式中,i1 to N 不同。

因此我们有,

P(N) = P(0)*P(N-1) + P(1)*P(N-2) + P(2)*P(N-3)....

基本情况是:

P(0) = 1 
P(1) = 1

因此这可以通过使用Dynamic Programming来解决。

【讨论】:

    【解决方案2】:

    请注意,特定的遍历只是标记树中节点的一种方式,因此对于任何两个相同长度的遍历,可能的二叉树的数量都是相同的。具有n 节点的二叉树的数量由n-1st Catalan number 给出。

    【讨论】:

      【解决方案3】:

      公式

      (2n)!/ (n)!(n+1)!

      2n * C(n) / (n+1)

      给出任何给定的 INORDER/PREORDER/POSTORDER 遍历的可能二叉树的数量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        相关资源
        最近更新 更多