1. 程式人生 > >pat甲級 1020 Tree Traversals

pat甲級 1020 Tree Traversals

題意:給出一顆二叉樹的後序遍歷序列和中序遍歷序列,求這棵二叉樹的層序遍歷序列。

思路:給出的數的長度為N,後序遍歷的最後一個是樹的根節點,在中序遍歷中找到這個點就可以將      一棵樹分為左子樹部分和右子樹部分,遞迴下去就可以得到要求的二叉樹,再利用BFS演算法求   得層序遍歷的輸出結果。

注意點:輸出時需要注意控制最後一個數後面的空格不應當被輸出

AC程式碼:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using
namespace std; const int maxn=50; struct node{ int data; node* lchild; node* rchild; }; int pre[maxn],in[maxn],post[maxn]; int n; node* creat(int postL,int postR,int inL,int inR){ if(postL>postR){ return NULL; } node* root=new node; root->data=post[postR];
int k; for(k=inL;k<=inR;k++){ if(in[k]==post[postR]){ break; } } int numLeft=k-inL; root->lchild=creat(postL,postL+numLeft-1,inL,k-1); root->rchild=creat(postL+numLeft,postR-1,k+1,inR); return root; } int num=0; void BFS(node* root){ queue
<node*>q; q.push(root); while(!q.empty()){ node* now=q.front(); q.pop(); printf("%d",now->data); num++; if(num<n)printf(" "); if(now->lchild!=NULL) q.push(now->lchild); if(now->rchild!=NULL) q.push(now->rchild); } } int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&post[i]); } for(int i=0;i<n;i++){ scanf("%d",&in[i]); } node* root=creat(0,n-1,0,n-1); BFS(root); }