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 ) N (≤30) 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 <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
int index;
int val;
bool operator<(const node &x) const {
return index < x.index;
}
};
vector<node> layerOrder;
int postOrder[35], inOrder[35];
void pre_traversal(int postRoot, int inL, int inR, int index) {
if (inL > inR) return;
layerOrder.push_back({index, postOrder[postRoot]});
int inRoot = inL;
while (inRoot < inR and inOrder[inRoot] != postOrder[postRoot]) ++inRoot;
pre_traversal(postRoot - 1 - inR + inRoot, inL, inRoot - 1, index * 2);
pre_traversal(postRoot - 1, inRoot + 1, inR, index * 2 + 1);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", &postOrder[i]);
for (int i = 0; i < n; ++i) scanf("%d", &inOrder[i]);
pre_traversal(n - 1, 0, n - 1, 1);
sort(layerOrder.begin(), layerOrder.end());
for (auto i = layerOrder.begin(); i < layerOrder.end(); ++i) {
printf("%d", i->val);
if (i + 1 != layerOrder.end()) printf(" ");
}
}