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 (≤30), 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<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
struct TNode{
int num;
TNode *left,*right;
};
TNode *TRoot;
int in_order[33],post_order[33],order[33];
int n,k;
void print(){
queue<TNode*> q;
q.push(TRoot);
while (!q.empty()){
TNode *T;
T=q.front();
q.pop();
// cout<<T->num<<" ";
order[k++]=T->num;
if (T->left) q.push(T->left);
if (T->right) q.push(T->right);
}
for (int i=0;i<n-1;i++)
cout<<order[i]<<" ";
cout<<order[n-1]<<endl;
}
void find(int x1,int x2,int y1,int y2,TNode *T){
if (x1<x2&&y1<y2){
int t;
for (t=y1;t<=y2;t++)
if (in_order[t]==post_order[x2]) break;
if (t!=y1){
TNode *T1;
T1=new TNode;
T1->right=NULL;
T1->left=NULL;
T1->num=post_order[x1+t-y1-1];
T->left=T1;
// print();
find (x1,x1+t-y1-1,y1,t-1,T1);
// find (t,x2-1,t+1,y2,T1);
}
if (t!=y2){
TNode *T2;
T2=new TNode;
T2->right=NULL;
T2->left=NULL;
T2->num=post_order[x2-1];
T->right=T2;
// find (x1,t-1,y1,t-1,T2);
find (x1+t-y1,x2-1,t+1,y2,T2);
}
}
else return;
}
int main(){
cin>>n;
for (int i=0;i<n;i++)
cin>>post_order[i];
for (int i=0;i<n;i++)
cin>>in_order[i];
k=0;
TRoot=new TNode;
TRoot->left=NULL;
TRoot->right=NULL;
TRoot->num=post_order[n-1];
find(0,n-1,0,n-1,TRoot);
print();
return 0;
}
欢迎指导和交流!