給一棵二叉樹的層序遍歷序列和中序遍歷序列,求這棵二叉樹的先序遍歷序列和後序遍歷序列。ios
每一個輸入文件中一組數據。app
第一行一個正整數N(1<=N<=30),表明二叉樹的結點個數(結點編號爲1~N)。接下來兩行,每行N個正整數,分別表明二叉樹的層序遍歷序列和中序遍歷序列。數據保證序列中1~N的每一個數出現且只出現一次。post
輸出兩行,每行N個正整數,分別表明二叉樹的先序遍歷序列和後序遍歷序列。每行末尾不輸出額外的空格。spa
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <map> #include <queue> using namespace std; const int maxn=1000000; struct Node { int data; Node *l,*r; }; int layer[maxn]; int in[maxn]; int n; vector<int> ans; void creat(Node * & root,int data,int index) { if(root==NULL) { root=new Node; root->l=NULL; root->r=NULL; root->data=data; //cout<<"end---"<<endl; return ; } int u; for(u=0;u<n;u++) { if(in[u]==root->data) break; } if(u<index) creat(root->r,data,index); else creat(root->l,data,index); } void pre(Node * root) { if(root!=NULL) { ans.push_back(root->data); pre(root->l); pre(root->r); } } void outans() { for(int i=0;i<ans.size();i++) { if(i>0) cout<<" "; cout<<ans[i]; } cout<<endl; } void post(Node * root){ if(root!=NULL) { post(root->l); post(root->r); ans.push_back(root->data); } } int main() { cin>>n; for(int i=0;i<n;i++) cin>>layer[i]; for(int i=0;i<n;i++) cin>>in[i]; Node * root=NULL; for(int i=0;i<n;i++) { int u; for(u=0;u<n;u++) { if(in[u]==layer[i]) break; } creat(root,layer[i],u); } ans.clear(); pre(root); outans(); ans.clear(); post(root); outans(); }