题意:给定一个树的BFS序和DFS序,求这棵树。
思路:用栈维护。对应BFS序列映射出了每个节点和根节点的距离,遍历dfs序列,对当前节点和栈顶节点比较,如果该节点距离根节点更远,则记录后将节点放入栈中。否则弹掉栈顶元素继续比较。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<stack>
#include<vector>
using namespace std;
#define maxn 1005
#define ll long long
int ant[maxn];
vector<int>vec[maxn];
int main()
{
int t,n;
while(~scanf("%d",&t))
{
for(int i=1;i<=t;i++)
{
scanf("%d",&n);
vec[i].clear();
ant[n]=i;
}
int rot;
scanf("%d",&rot);
stack<int>sta;
sta.push(rot);
for(int i=1;i<t;i++)
{
scanf("%d",&n);
while(1)
{
int to=sta.top();
if (to==rot||ant[to]+1<ant[n])
{
vec[to].push_back(n);
sta.push(n);
break;
}
else sta.pop();
}
}
for(int i=1;i<=t;i++)
{
printf("%d:",i);
for(int j=0;j<vec[i].size();j++)
printf(" %d",vec[i][j]);
printf("\n");
}
}
return 0;
}