这道题代码实现明天我会发,今天就说一说思路,首先得在大家理解题的基础上进行解释,UVa的题太难懂了,每次做题都像一次英语阅读似的,不过这道题没这么难读懂。
简单来说就是给了这棵树的dfs序与bfs序,然后让你建出符合条件的树。对于建树来说我们最重要的是知道谁是谁父亲,谁是谁儿子,找出这种祖先关系就行,那么从dfs入手便是比较好的方法,因为dfs的遍历顺序就是从父亲到儿子,那么bfs序跟我们提供帮助,让我们判断结点之间的关系。
怎么判断呢,我们采用一种比较好想的办法,如果直接从dfs序得到所有结点的关系是不太好弄的,我们所做的仅仅是判断dfs相邻的两个结点之间的关系就行了,相邻的两个结点关系只有两种,1是父子关系2是他们不满足父子关系,所以接下来无非就是确认是不是父子关系就行,我们想了想,对于dfs相邻的两个结点A、B
满足下列情况的一种就可以说AB是父子关系了:
1、bfs序A的位置+1<bfs序B的位置
2、bfs序A的位置+1=bfs序B的位置 并且 A > B
3、A的bfs序为1此时B一定是A的儿子
知道这些条件就能判断AB的关系,如果AB不是父子关系,那么
我们判断A的父亲与B是不是父子关系,以此类推,代码自然就需要用栈了(自己想一想问什么)后面的代码明天会发,不长
这道题考我们对bfs与dfs的认识程度,望大家能够琢磨上面3个条件的理由,如果不太清楚请留言我明天会回复的。
嗯。。第二个条件如果只满足前面的话(A + 1 = B)的话AB可能是兄弟姐妹(同一深度),如果满足A>B那么一定不是兄弟姐妹了,因为如果是兄弟姐妹那么dfs序一定会将B放在A的前面对吧!