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 <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <stack>
#include <iomanip>
#include <cstdlib>
#include <queue>
using namespace std;
int post[33],in[33];
int tree[10000];
void solve(int l1,int r1,int l2,int r2,int node){
if(l1 > r1){
tree[node] = -1; //-1代表子树为空
return;
}
else tree[node] = post[r1];
for(int i=l2;i<=r2;++i){
if(in[i] == post[r1]){
int len = i-l2;
solve(l1,l1+len-1,l2,i-1,node*2); //左子树
solve(l1+len,r1-1,i+1,r2,node*2+1); //右子树
break;
}
}
}
int main(){
int n;
cin >> n;
for(int i=1;i<=n;++i) cin >> post[i];
for(int i=1;i<=n;++i) cin >> in[i];
memset(tree,-1,sizeof(tree));
solve(1,n,1,n,1);
// for(int i=1;i<=10;++i){
// cout << i << " : " << tree[i] << endl;
// }
queue<int> que; //队列存放tree数组的下标
que.push(1);
while(!que.empty()){
int index = que.front();
if(tree[index*2] != -1){
que.push(index*2);
}
if(tree[index*2+1] != -1){
que.push(index*2+1);
}
if(index == 1) cout << tree[index];
else cout << " " << tree[index];
que.pop();
}
cout << endl;
return 0;
}