重建二叉树
- 题目描述:
-
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
- 输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。
输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。
输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。
- 输出:
-
对应每个测试案例,输出一行:
如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。
如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。
- 样例输入:
-
8 1 2 4 7 3 5 6 8 4 7 2 1 5 3 8 6 8 1 2 4 7 3 5 6 8 4 1 2 7 5 3 8 6
- 样例输出:
-
7 4 2 5 8 6 3 1 No
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAXNUM 1000 4 int pre[MAXNUM],mid[MAXNUM],post[MAXNUM]; 5 int flag; 6 int num,post_k=0; 7 int getIndex(int key,int s,int e) 8 { 9 int i=0; 10 for(i=s; i<e; i++) 11 if(mid[i]==key) 12 return i; 13 return -1; 14 } 15 void createTree(int pre_i, int mid_j, int len) 16 { 17 int mid; 18 if(len<=0) 19 { 20 flag = 1; 21 return ; 22 } 23 mid = getIndex(pre[pre_i],mid_j,mid_j+len); 24 if(mid== -1) 25 { 26 flag = -1; 27 return; 28 } 29 if(flag ==1)createTree(pre_i+1,mid_j,mid - mid_j); 30 if(flag==1)createTree(pre_i+(mid - mid_j+1),mid+1,len-1-(mid-mid_j)); 31 post[post_k] = pre[pre_i] ; 32 post_k++; 33 } 34 35 void main() 36 { 37 int i,j; 38 39 while (scanf("%d",&num) != EOF) 40 { 41 for(i=0; i<num; i++) 42 scanf("%d",&pre[i]); 43 for(j=0; j<num; j++) 44 scanf("%d",&mid[j]); 45 flag =1; 46 post_k = 0; 47 createTree(0,0,num); 48 if(flag == 1) 49 { 50 for (i=0; i<num;i++) 51 { 52 printf("%d ",post[i]); 53 } 54 printf("\n"); 55 } 56 else 57 { 58 printf("%s\n","No"); 59 } 60 } 61 62 } 63 /************************************************************** 64 Problem: 1385 65 User: xuebintian 66 Language: C 67 Result: Accepted 68 Time:0 ms 69 Memory:924 kb 70 ****************************************************************/