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 (<=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 7Sample Output:
4 1 6 3 5 7 2
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int pos[111],in[111];
struct node
{
int l,r;
}tree[111];
queue<int>qu;
int dfs(int a[],int b[],int n) //已知后续中序还原二叉树
{
int i;
if(n<=0) return -1;
int r=a[n-1];
tree[r].l=-1,tree[r].r=-1;
for(i=0;i<n;i++) {
if(b[i]==r) break;
}
tree[r].l=dfs(a,b,i);
tree[r].r=dfs(a+i,b+i+1,n-i-1);
return r;
}
int main()
{
ios::sync_with_stdio(false);
int i,j,n,r,f=0;
cin>>n;
for(i=0;i<n;i++) cin>>pos[i];
for(i=0;i<n;i++) cin>>in[i];
r=dfs(pos,in,n);
qu.push(r);
while(!qu.empty()) {
if(f) cout<<" ";
r=qu.front(),qu.pop(),cout<<r;
if(tree[r].l!=-1) qu.push(tree[r].l);
if(tree[r].r!=-1) qu.push(tree[r].r);
f=1;
}
cout<<endl;
return 0;
}
int dfs(int a[],int b[],int n)
{
int i;
if(n<=0) return -1;
int r=a[0];
tree[r].l=-1,tree[r].r=-1;
for(i=0;i<n;i++) {
if(b[i]==r) break;
}
tree[r].l=dfs(a+1,b,i);
tree[r].r=dfs(a+i+1,b+i+1,n-i-1);
return r;
}
前序:4,1,3,2,6,5,6 根->左子数->右子数
中序:1,2,3,4,5,6,7 左子数->根->右子数
后续:2,3,1,5,7,6,4 左子数->右子数->根