今天看学长发过来的资料上面提到了中科院机试会有一个二叉树的前序中序得到后序的题目。中科院的代码编写时间为一个小时,于是在七点整的时候我开始拍这个题目。这种类型完全没做过,只有纸质实现过,主体代码半个小时差不多刚好拍完。适应杭电的多数据格式改了5分钟。感觉这个时间有点长,仍须努力。
(g++可通过,因为是C++和C的混风)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 struct node{ 5 node *left; 6 node *right; 7 int num; 8 node() 9 { 10 left=NULL; 11 right=NULL; 12 num=0; 13 } 14 }; 15 int t; 16 int index=0; 17 int pre[1003]; 18 int in[1003]; 19 int ans[1003]; 20 void buildTree(node *root,int prel,int prer,int inl,int inr) 21 { 22 root->num=pre[prel]; 23 root->left=new node(); 24 root->right=new node(); 25 for(int i=inl;i<=inr;i++) 26 { 27 if(in[i]==pre[prel]) 28 { 29 int zuol=i-inl; 30 int youl=inr-i; 31 if(zuol==0&&youl==0) 32 { 33 root->right=NULL; 34 root->left=NULL; 35 } 36 else 37 { 38 if(i==inr) 39 { 40 buildTree(root->left,prel+1,prel+zuol,inl,i-1); 41 root->right=NULL; 42 } 43 else 44 if(i==inl) 45 { 46 buildTree(root->right,prel+zuol+1,prer,i+1,inr); 47 root->left=NULL; 48 } 49 else 50 { 51 52 buildTree(root->left,prel+1,prel+zuol,inl,i-1); 53 buildTree(root->right,prel+zuol+1,prer,i+1,inr); 54 } 55 } 56 } 57 } 58 } 59 void print(node *root) 60 { 61 if(root->left!=NULL) 62 print(root->left); 63 if(root->right!=NULL) 64 print(root->right); 65 ans[index++]=root->num; 66 } 67 int main() 68 { 69 int temp; 70 71 while(scanf("%d",&t)!=EOF) 72 { 73 index=0; 74 memset(pre,0,sizeof(int)); 75 memset(in,0,sizeof(int)); 76 memset(ans,0,sizeof(int)); 77 for(int i=0;i<t;i++) 78 scanf("%d",&pre[i]); 79 for(int i=0;i<t;i++) 80 scanf("%d",&in[i]); 81 node *root=new node(); 82 buildTree(root,0,t-1,0,t-1); 83 print(root); 84 for(int i=0;i<t-1;i++) 85 printf("%d ",ans[i]); 86 printf("%d ",ans[t-1]); 87 } 88 return 0; 89 }
后来看了下网上代码,发现有不需要构造树,直接用DFS的。高端洋气不清楚的样子。。