uva10410 栈

根据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;
}

如有不当之处欢迎指出!

上一篇:vim让一些不可见的字符显示出来吧


下一篇:Learn Python More