从正确的遍历中寻找预订单?

时间:2015-03-14 07:02:19

标签: algorithm data-structures tree traversal inorder

我遇到了一个中期考试问题,这个问题花了4天时间,我开始讨厌它!

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

前序遍历会返回什么?

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

谁可以帮助我学习?

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

3 个答案:

答案 0 :(得分:5)

所以顺序是:

E A C K F H D B G

预购必须来自:

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

您应该继续为每个选项绘制树,同时使其适合inorder遍历并查看可能的那个。

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

<强>一个。

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

        | 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

我们已经完成了,不会有更多的分裂。现在在这棵树上运行preorder遍历,你会得到:

F A E C K D H B G

这不是我们开始的,所以我们达成了矛盾。所以它不能 a。为其他人做同样的事情。

答案 1 :(得分: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)存在(至少一个)适合多个树的有序遍历。

答案 2 :(得分:0)

其中一个b-tree可能是:enter image description here

因此,预订序遍历返回:

H K A E C F B D G

另一个是:
enter image description here

对于哪个预订序遍历给出:

H A E K C F B D G

还有一个是: enter image description here

对于哪个预订序遍历给出:

K A E C H F B D G

,这不是你的选择。任何人的评论都是受欢迎的,因为我无法为给定的inorder遍历提出任何其他二叉树..

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