1020 Tree Traversals (25分)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<vector> #include<cmath> #include<cstring> #include<queue> #include<string.h> using namespace std; typedef long long ll; const int maxn=10010; int post[maxn]; int in[maxn]; int level[maxn]; void f(int root,int start,int end,int index) {//通过后序遍历根节点,确定中序遍历根节点下标,存入层序遍历数组中,再递归中序的左和右子树 //root 后序遍历根节点位置 //start 中序遍历序列首地址,end: 中序遍历序列尾地址 index :满二叉树中层次结点的下标(根节点在层次序列中的位置) if(start>end)//中序序列长度为0,该子树遍历结束 { return ; } int i=start;//i为中序遍历中根节点的下标 while(i<end&&in[i]!=post[root]){//通过后序根节点,确定中序根节点下标 i++; } level[index]=post[root];//根节点位置存入层序遍历数组 f(root-(end-i+1),start,i-1,2*index+1);//递归遍历左子树 f(root-1,i+1,end,2*index+2);//递归遍历右子树 } int main() { int N; memset(level,-1,sizeof(level)); 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]); } f(N-1,0,N-1,0); //如果不是满二叉树,index的值非连续,所以数组的下标非连续 int cnt=0; for(int i=0;i<maxn; i++) { if(level[i]!=-1){ if(cnt<N-1){ printf("%d ",level[i]); } else{ printf("%d\n",level[i]); } if(cnt>N){ break; } cnt++; } } return 0; }