Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in "zigzagging order" -- that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.
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 inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the zigzagging sequence of the tree in a line. 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:
8
12 11 20 17 1 15 8 5
12 20 17 11 15 8 5 1
Sample Output:
1 11 5 8 17 12 20 15
思路
- 在中序和后序构建二叉树的基础上,使用
depth
记录树深度,然后使用ans
记录每层的结点,无论前序、中序、后序遍历,每一层的结点顺序都是一样的(先左子树后右子树)。使用maxDepth
记录深度的最大值。
代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 35;
int n;
int post[maxn], in[maxn], maxDepth = 0;
vector<int> ans[maxn];
void create(int inL, int inR, int postL, int postR, int depth)
{
if (postL > postR)
return;
maxDepth = max(depth, maxDepth);
ans[depth].push_back(post[postR]);
int k = inL;
while (k <= inR && in[k] != post[postR]) k ++;
int num = k - inL;
create(inL, k - 1, postL, postL + num - 1, depth + 1);
create(k + 1, inR, postL + num, postR - 1, depth + 1);
}
int main()
{
//freopen("test.txt", "r", stdin);
scanf("%d", &n);
for (int i = 0; i < n; i ++) scanf("%d", &in[i]);
for (int i = 0; i < n; i ++) scanf("%d", &post[i]);
create(0, n - 1, 0, n - 1, 1);
printf("%d", ans[1][0]);
for (int i = 2; i <= maxDepth; i ++)
{
if (i % 2 == 1)
reverse(ans[i].begin(), ans[i].end());
for (int j = 0; j < ans[i].size(); j ++)
printf(" %d", ans[i][j]);
}
return 0;
}