首页 > 代码库 > 二叉树重构
二叉树重构
给你一颗真二叉树(节点要么没有孩子,要么有两个孩子)的前序和后序遍历输出中序遍历序列。
/************************************************************************* > 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; }
二叉树重构
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。