【问题标题】:Finding Preoder from Just Inorder Traversal?从 Just Inorder Traversal 中找到预购?
【发布时间】:2015-03-14 07:02:18
【问题描述】:

我遇到了一个 4 天前的期中考试题,我无法理解!

假设当我们对树进行中序遍历时给出了答案,那么我们如何在前序遍历的情况下找到解决方案。我有以下示例:当按顺序遍历树时导致E A C K F H D B G;

前序遍历会返回什么?

a. FAEKCDBHG
b. FAEKCDHGB
c. EAFKHDCBG
d. FEAKDCHBG

谁能帮助我学习?

编辑: 我知道答案是:FAEKCDHGB。但这是如何计算的?

【问题讨论】:

    标签: algorithm data-structures tree traversal inorder


    【解决方案1】:

    所以顺序是:

    E A C K F H D B G
    

    并且预购必须来自:

    a. FAEKCDBHG
    b. FAEKCDHGB
    c. EAFKHDCBG
    d. FEAKDCHBG
    

    您应该继续为这些选项中的每一个绘制树,同时使其适合中序遍历并查看哪个是可能的。

    为此,对于前序遍历中的每个字符,围绕该字符将中序遍历一分为二。

    一个。

    我们知道F 必须是根。拆分F周围的中序遍历:

            | F | 
     E A C K     H D B G
    

    前序遍历中的下一个字符是A。在A周围拆分包含A的子树:

                | F | 
         | A |        H D B G
        E     C K
    

    接下来是E。没有什么可拆分的。接下来是K

                | F | 
         | A |        H D B G
        E     C
                K
    

    接下来是C。没有什么可拆分的。

    接下来是D

                | F | 
         | A |        | D |
        E     C      H     B G
                K
    

    接下来是B

                | F | 
         | A |        | D |
        E     C      H     B 
                K            G
    

    我们已经完成了,不会再有分裂的可能了。现在在这棵树上运行前序遍历,你会得到:

    F A E C K D H B G
    

    这不是我们开始的,所以我们遇到了矛盾。所以它不可能是a。对其他人做同样的事情。

    【讨论】:

    • @Prof.KosiNoura - 是的。
    • 哇,今天我打错了答案后,我明白了怎么做... :)
    • 第三步子树的根元素不应该是K,它的左孩子是C吗?
    【解决方案2】:

    答案是不确定的。

    看看那两棵树:

     E
      \
       A
        \
         C 
          \
           K
            \
             F 
              \
               H 
                \
                 D 
                  \
                   B
                    \
                     G
    

    还有:

       A
     /  \
    E    C 
          \
           K
            \
             F 
              \
               H 
                \
                 D 
                  \
                   B
                    \
                     G
    

    这两棵树的中序遍历是一样的,但是第一棵的前序遍历是EACKFHDBG,而第二棵的有序遍历是AECKFHDBG

    因此,给定一个中序遍历,有不止一个可能的二叉树适合该遍历。这是因为存在n! 可能的排列(因此是按顺序遍历),而there are much more binary trees。这保证 (pigeonhole principle) 存在(至少一个)适合多棵树的有序遍历。

    【讨论】:

    • 感谢您的有用回答,但我认为我们必须考虑多项选择!我想。
    • 其实你把最后一句话倒过来了。二叉树的数量是一个加泰罗尼亚数,仅呈指数增长(非常大约 4^n)。嗯!更大(实际上不难看出任何排列只会产生一棵二叉搜索树,但多个排列可能适合同一棵未标记的树)。
    • @ErickWong 这(加泰罗尼亚语)是具有相同节点的二叉树的数量(即您只关心拓扑,而不是每个节点的标记)。
    【解决方案3】:

    可能的 b 树之一是:

    所以,前序遍历返回:

    H K A E C F B D G

    另一个是:

    前序遍历给出的结果:

    H A E K C F B D G

    还有一个是:

    前序遍历给出的结果:

    K A E C H F B D G

    ,这不是你的选择。欢迎任何人发表评论,因为我无法为给定的中序遍历提供任何其他二叉树..

    我在考试中也有这个问题,但后来知道 b 是谷歌搜索该问题的答案。哈哈。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多