最近,我被要求编写一个程序来解决下面的问题 的描述
给定一棵树,两个要求,
- 遍历从根节点开始的所有节点。在同一时间,你 应保证每个边缘都被访问过两次。
- 特别是,应该按照给定的顺序访问叶节点。
醇>
输入
输出
如果您可以遍历满足上述两个要求的树,则输出 那个节点序列。否则,输出
-1
答案 0 :(得分:2)
首先建立一个有向图。
检测它是否有周期是well-known problem。如果有循环,则返回-1。其余部分假定没有。
现在以递归方式执行树的in-order traversal,从叶子到根分配顺序对,如下所示。
对于叶节点,请说输入中的顺序是 o 。它的订单对是(o,o)。
对于非叶子节点,检查其子节点的顺序对之间是否存在重叠(比如一个子节点有一个顺序对(1,20),另一个子节点有一个顺序对(3, 4))。如果有重叠,则输出-1。否则,按子订单对的第二项对子项进行排序。如果子项的顺序对是(s1,e1),(s2,e2),...,(sm,em),那么节点的顺序对是(s1 ,em)。
最后,按照孩子的顺序再次运行有序步行。这种遍历就是问题的答案。