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
细节:子树在数组中的范围。
#include <iostream>
#include <queue>
using namespace std;
const int Max=31;
struct node
{
int info;
int left;
int right;
}tree[Max];
int post[Max];
int in[Max];
int creat(int n)
{
for (int i=1;i<=n;++i) cin>>post[i];
for (int i=1;i<=n;++i) cin>>in[i];
return post[n];
}
void build(int root, int p1, int p2, int n)
{
tree[root].info=root;
if (n==1) return;
int flag=0;
for(int i=p2;i<p2+n;++i){
if (root==in[i]) {
flag=i-p2;
break;
}
}
if (flag){
tree[root].left=post[p1+flag-1];
build(tree[root].left,p1,p2,flag);
}
if (n-flag-1){
tree[root].right=post[p1+n-2];
build(tree[root].right,p1+flag,p2+flag+1,n-flag-1);
}
}
void print(int root)
{
queue<int> q;
q.push(root);
while(!q.empty()){
int v=q.front();
q.pop();
if (tree[v].left) q.push(tree[v].left);
if (tree[v].right) q.push(tree[v].right);
cout<<v;
if (!q.empty()) cout<<' ';
}
}
int main()
{
// freopen("test.txt","r",stdin);
int N;
cin>>N;
int root;
root=creat(N);
build(root,1,1,N);
print(root);
return 0;
}
.