根据DFS和BFS重建树。
BFS反映了当前节点到达根结点的距离,通过栈把当前处理的树或则子树的根结点放在栈顶,通过遍历DFS序列,判断当前元素与栈顶元素的关系,如果是子节点,就将它压入栈中成为新的栈顶元素,因为在DFS序中一定会出现它的子节点,因此放在栈顶是合适的,如果是兄弟节点,直接出栈,一直出栈直到找到它的父节点。
AC代码:
#include<cstdio> #include<stack> #include<vector> using namespace std; const int maxn=1000+5; int dis[maxn]; vector<int>ans[maxn]; stack<int>s; int main(){ int n; while(scanf("%d",&n)==1){ int u; for(int i=0;i<n;++i) { scanf("%d",&u); dis[u]=i; } int root; scanf("%d",&root); s.push(root); for(int i=1;i<n;++i){ int par; scanf("%d",&u); while(1){ par=s.top(); if(par==root||dis[par]+1<dis[u]){ ans[par].push_back(u); s.push(u); break; } else s.pop(); } } for(int i=1;i<=n;++i){ printf("%d:",i); int n=ans[i].size(); for(int j=0;j<n;++j){ printf(" %d",ans[i][j]); } printf("\n"); ans[i].clear(); } } return 0; }
如有不当之处欢迎指出!