1127 ZigZagging on a Tree (30分)/树遍历转换/双指针

题目描述

1127 ZigZagging on a Tree (30分)/树遍历转换/双指针_第1张图片1127 ZigZagging on a Tree (30分)/树遍历转换/双指针_第2张图片

题目大意

给定中序、后序序列,交替从左到右和从右到左输出每一层。

分析

用index标识结点的序号(完全二叉树的表示法),在转换为先序遍历的过程中,递归求得各结点的index,通过双指针法找到每一层的范围,交替方向输出即可。

#include
#include
#include
using namespace std;
struct node {
	int val, index;
};
vector<int> in, post;
vector<node> v;
bool cmp(node a, node b) {
	return a.index < b.index;
}
void dfs(int inL, int inR, int postL, int postR, int index) {
	if (postL > postR) return;
	int root = post[postR];
	v.push_back({ root,index });
	int k;
	for (k = inL; k <= inR && in[k] != root; k++);
	int numL = k - inL;
	dfs(inL, k - 1, postL, postL + numL - 1, index * 2);
	dfs(k + 1, inR, postL + numL, postR - 1, index * 2 + 1);
}
int main() {
	//freopen("1.txt", "r", stdin);
	int n; cin >> n;
	in.resize(n); post.resize(n);
	for (int i = 0; i < n; i++) scanf("%d", &in[i]);
	for (int i = 0; i < n; i++) scanf("%d", &post[i]);
	dfs(0, n - 1, 0, n - 1, 1);
	sort(v.begin(), v.end(), cmp);
	cout << v[0].val;
	int i, j, maxindex = 2, flag = 0;
	for (i = 1; i < n; i = j) {
		flag = !flag;
		maxindex *= 2;
		for (j = i; j < n&&v[j].index < maxindex; j++); //注意j
		if (flag) {
			for (int k = i; k < j; k++) cout << " " << v[k].val;
		}
		else {
			for (int k = j - 1; k >= i; k--) cout << " " << v[k].val;
		}
	}
	return 0;
}

你可能感兴趣的:(PAT)