PAT 1127 ZigZagging on a Tree(30分)

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.

PAT 1127 ZigZagging on a Tree(30分)

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;
}
上一篇:1127 ZigZagging on a Tree (30分)


下一篇:使用C/C++中的itoa将整数转换为二进制字符串