访谈:如何遍历满足以下两个要求的树

时间:2016-07-27 12:59:30

标签: java algorithm

最近,我被要求编写一个程序来解决下面的问题 的描述

  

给定一棵树,两个要求

     
      
  1. 遍历从根节点开始的所有节点。在同一时间,你   应保证每个边缘都被访问过两次。
  2.   
  3. 特别是,应该按照给定的顺序访问叶节点。
  4.   

输入

  • 第一行:整数K,表示节点数,K> = 1&amp;&amp; K <= 300
  • K-1行:每行包含两个整数,表示一个边(节点ID为1,2,3 ..,1表示根节点的ID)。
  • 最后一行:按顺序排列所有叶节点(应访问叶节点) 按此顺序)。

输出

  

如果您可以遍历满足上述两个要求的树,则输出   那个节点序列。否则,输出-1

两个样本:

输入1:
3
1 2
2 3
3
输出是:
1 2 3 2 1
input1

输入2:
6
1 2
1 3
2 4
4 5
4 6
5 3 6
输出是:
-1
input2

1 个答案:

答案 0 :(得分:2)

首先建立一个有向图。

检测它是否有周期是well-known problem。如果有循环,则返回-1。其余部分假定没有。

现在以递归方式执行树的in-order traversal,从叶子到根分配顺序对,如下所示。

  1. 对于叶节点,请说输入中的顺序是 o 。它的订单对是(o,o)

  2. 对于非叶子节点,检查其子节点的顺序对之间是否存在重叠(比如一个子节点有一个顺序对(1,20),另一个子节点有一个顺序对(3, 4))。如果有重叠,则输出-1。否则,按子订单对的第二项对子项进行排序。如果子项的顺序对是(s1,e1),(s2,e2),...,(sm,em),那么节点的顺序对是(s1 ,em)

  3. 最后,按照孩子的顺序再次运行有序步行。这种遍历就是问题的答案。