二叉树重构

来源:互联网 发布:yii商城源码 编辑:程序博客网 时间:2024/06/07 14:11

给你一颗真二叉树(节点要么没有孩子,要么有两个孩子)的前序和后序遍历输出中序遍历序列。


/*************************************************************************    > File Name: Euler.cpp    > Author: acvcla    > QQ:     > Mail: acvcla@gmail.com     > Created Time: 2014年10月30日 星期四 11时19分11秒 ************************************************************************/#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn=4000000+5;#define rep(i,a,b) for(int i=(a);i<=(b);i++)struct tree{int date;tree *l,*r;tree(int val=0):date(val){l=r=0;}}M[maxn];int cnt;tree *newnode(int val){M[cnt].l=M[cnt].r=0;M[cnt].date=val;cnt++;return &M[cnt-1];}int A[maxn],B[maxn],ans[maxn],cot,n,pos1[maxn],pos2[maxn];tree* built(int l,int r,int cur){tree *now=NULL;now=newnode(B[r]);if(l==r)return now;++cur,--r;now->l=built(l,pos1[A[cur]],cur);now->r=built(pos1[A[cur]]+1,r,pos2[B[r]]);return now;}struct V{void operator () (int x){ans[++cot]=x;}};template<typename T>void dfs(tree *p,T &vist){if(!p)return;dfs(p->l,vist);vist(p->date);dfs(p->r,vist);}char ch;void read(int &x){x=ch=0;while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}}int main(){while(~scanf("%d",&n)){rep(i,1,n){read(A[i]);pos2[A[i]]=i;}rep(i,1,n){read(B[i]);pos1[B[i]]=i;}cnt=cot=0;tree *root=built(1,n,1);V cacu;dfs(root,cacu);rep(i,1,cot)printf("%d%c",ans[i],i==cot?'\n':' ');}return 0;}

3 0