标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1710
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4210 Accepted Submission(s): 1908
题解:意思很直白。给你二叉树的先序序列和中序序列,让你求后序序列。先利用先序序列和中序序列的特征递归建树,再后序遍历。
代码:
1 #include <fstream> 2 #include <iostream> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N=1005; 8 struct node{ 9 int c; 10 struct node *lch,*rch; 11 }; 12 int n,tn; 13 int pre[N],in[N]; 14 15 void createTree(int* l,int* r,int i,int j,int e,int f,node** tree); 16 void postOrder(node *p); 17 18 int main(){ 19 //freopen("D:\\input.in","r",stdin); 20 //freopen("D:\\output.out","w",stdout); 21 node *tree; 22 while(~scanf("%d",&n)){ 23 for(int i=0;i<n;i++) 24 scanf("%d",&pre[i]); 25 for(int i=0;i<n;i++) 26 scanf("%d",&in[i]); 27 createTree(pre,in,0,n-1,0,n-1,&tree); 28 tn=0; 29 postOrder(tree); 30 } 31 return 0; 32 } 33 void createTree(int* l,int* r,int i,int j,int e,int f,node** tree){//可以思考下这里为什么是**,可不可以用*? 34 int m; 35 (*tree)=new node; 36 (*tree)->c=l[i]; 37 m=e; 38 while(r[m]!=l[i]) m++; 39 if(m==e) (*tree)->lch=NULL; 40 else createTree(l,r,i+1,i+m-e,e,m-1,&(*tree)->lch); 41 if(m==f) (*tree)->rch=NULL; 42 else createTree(l,r,i+m-e+1,j,m+1,f,&(*tree)->rch); 43 } 44 void postOrder(node *p){ 45 if(p!=NULL){ 46 postOrder(p->lch); 47 postOrder(p->rch); 48 printf("%d",p->c); 49 if(++tn<n) printf(" "); 50 else puts(""); 51 delete p; 52 } 53 }
hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)
标签:
原文地址:http://www.cnblogs.com/jiu0821/p/4634663.html