问题 C: 还原二叉树
时间限制: 1 Sec
内存限制: 128 MB
提交: 322
解决: 153
题目描述
给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。
输入
每个输入文件中一组数据。
第一行一个正整数N(1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。
输出
输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。每行末尾不输出额外的空格。
样例输入
7
3 5 4 2 6 7 1
2 5 3 6 4 7 1
样例输出
3 5 2 4 6 7 1
2 5 6 1 7 4 3
解题思想:
习惯通过静态的方式来处理树的问题了。整个过程相当于模拟二叉树的层次遍历将二叉树还原出来,最后对其进行遍历。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define MAXN 100 5 using namespace std; 6 typedef struct Node{ 7 int v,L,R; 8 Node(){v=L=R=-1;} 9 }Node; 10 Node node[MAXN]; 11 int lt[MAXN],it[MAXN],flag[MAXN],a; 12 void pro(int x){ 13 if(a==0){ 14 printf("%d",node[x].v); 15 a=1; 16 }else{ 17 printf(" %d",node[x].v); 18 } 19 if(node[x].L!=-1){ 20 pro(node[x].L); 21 } 22 if(node[x].R!=-1){ 23 pro(node[x].R); 24 } 25 } 26 void post(int x){ 27 if(node[x].L!=-1){ 28 post(node[x].L); 29 } 30 if(node[x].R!=-1){ 31 post(node[x].R); 32 } 33 if(a==0){ 34 printf("%d",node[x].v); 35 a=1; 36 }else{ 37 printf(" %d",node[x].v); 38 } 39 } 40 int main() 41 { 42 int n; 43 scanf("%d",&n); 44 for(int i=0;i<n;i++) 45 scanf("%d",<[i]); 46 for(int i=0;i<n;i++) 47 scanf("%d",&it[i]); 48 49 memset(flag,0,sizeof(flag)); 50 int index1,index2; 51 index1=index2=0; 52 for(int i=0;index1<n;){ 53 if(node[index1].v==-1){ 54 node[index1].v=lt[i++]; 55 } 56 int c=0; 57 while(node[index1].v!=it[c]) 58 c++; 59 flag[c]=1; 60 if(c>0&&flag[c-1]!=1){ 61 node[index1].L=i; 62 node[i].v=lt[i++]; 63 c=0; 64 while(node[index1].v!=it[c]) 65 c++; 66 flag[c]=1; 67 } 68 if(c<n-1&&flag[c+1]!=1){ 69 node[index1].R=i; 70 node[i].v=lt[i++]; 71 c=0; 72 while(node[index1].v!=it[c]) 73 c++; 74 flag[c]=1; 75 } 76 index1++; 77 } 78 a=0; 79 pro(0); 80 printf(" "); 81 a=0; 82 post(0); 83 printf(" "); 84 //for(int i=0;i<n;i++) 85 // printf("%d %d %d ",node[i].v,node[i].L,node[i].R); 86 return 0; 87 }