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
Solution:
#include <bits/stdc++.h>
using namespace std;
vector<int> post, in;
int n;
struct Node {
int val;
Node *left, *right;
Node(int x):val(x), left(NULL), right(NULL) {}
};
Node *create(int postL, int postH, int inL, int inH) {
if (postL > postH) {
return NULL;
}
Node *root = new Node(post[postH]);
int k;
for (k = inL; in[k] != post[postH]; k++);
int leftNum = k - inL;
root -> left = create(postL, postL+leftNum-1, inL, inL+leftNum-1);
root -> right = create(postL+leftNum, postH-1, inL+leftNum+1, inH);
return root;
}
int cnt = 0;
void levelOrder(Node *root) {
queue<Node*> Q;
Q.push(root);
while (!Q.empty()) {
Node *u = Q.front();
Q.pop();
cnt++;
cout << u -> val;
if (cnt < n) {
cout << " ";
}
if (u -> left != NULL) {
Q.push(u -> left);
}
if (u -> right != NULL) {
Q.push(u -> right);
}
}
}
int main() {
cin >> n;
post.resize(n);
in.resize(n);
for (int i = 0; i < n; i++) {
cin >> post[i];
}
for (int i = 0; i < n; i++) {
cin >> in[i];
}
Node *root = create(0, n-1, 0, n-1);
levelOrder(root);
return 0;
}