标签:
提交代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn=99999; #define lson (root<<1) #define rson (root<<1)+1 #define bug printf("---\n"); int n; int T[maxn]; int post[maxn]; int in[maxn]; int vis[maxn]; int first=1; void bfs(int root)//本题 也可以不用这个输出,见下面的注释 { queue<int> q; memset(vis,false,sizeof(vis)); vis[root]=true; q.push(root); while(!q.empty()) { int root=q.front(); q.pop(); if(first)printf("%d",T[root]),first=0; else printf(" %d",T[root]); if(!vis[lson]&&T[lson]!=-1) { vis[lson]=true; q.push(lson); } if(!vis[rson]&&T[rson]!=-1) { vis[rson]=true; q.push(rson); } } } //中序+后序=建树 //pl为post左边端点,pr为post右端点 il,lr为中序的左右端点 ///pr-ir+p-1==pr-(ir-p)-1 void build(int root,int pl,int pr,int il,int ir) { if(pl>pr)return; int p=il; while(in[p]!=post[pr])p++;//后序判断的根结点,在中序里找出来 T[root]=post[pr];//当前根结点赋值 build(lson,pl,pr-ir+p-1,il,p-1);//建立左子树 build(rson,pr-ir+p,pr-1,p+1,ir);//建立右子树 } int main() { int m,i,j,k,t; freopen("in.txt","r",stdin); memset(T,-1,sizeof(T)); cin>>n; for(i=0; i<n; i++) cin>>post[i]; for(i=0; i<n; i++) cin>>in[i]; build(1,0,n-1,0,n-1); //第一种的直接输出,因为T数组的存储就是层次的 vector<int>v; for(i=1;i<maxn;i++)if(T[i]!=-1) v.push_back(T[i]); m=v.size(); for(i=0;i<=m-2;i++) printf("%d ",v[i]); printf("%d\n",v[m-1]); //第二种的按层次遍历后再输出 //bfs(1); //cout<<endl; return 0; }
标签:
原文地址:http://blog.csdn.net/u013167299/article/details/44239941