PAT Tree Traversals (25) [⼆叉树的遍历,后序中序转层序] HERODING的PAT之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT Tree Traversals (25) [⼆叉树的遍历,后序中序转层序] HERODING的PAT之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述题目大意:
给定⼀棵⼆叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这⾥假设键值都是互不相等的正整数。

解题思路:
解决该题的关键在于要理解如何通过中序遍历和后序遍历获取前序遍历,这在我给的链接中有详细说明,弄明白之后,只需要在这基础上加上位置的标记即可,代码如下:

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

// 保存位置和值 
struct node {
	int index, value;
};
 
 
vector<int> post, in;
vector<node> ans; 
 
 // 排序判断函数 
bool cmp(node a, node b) {
	return a.index < b.index;
}

void pre(int root, int start, int end, int index) {
	// 开始大于结尾直接结束 
	if (start > end) {
		return;
	}
	int i = start;
	// 找到根在中序遍历中的位置 
	while(i < end && in[i] != post[root]) {
		i ++;
	}
	// 把根放入结果中 
	ans.push_back({index, post[root]});
	// 向左子树 
	pre(root - 1 - end + i, start, i - 1, 2 * index + 1);
	// 向右子树 
	pre(root - 1, i + 1, end, 2 * index + 2);
}

int main() {
	int n;
	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];
	}
	// 前序遍历 
	pre(n - 1, 0, n - 1, 0);
	// 排序 
	sort(ans.begin(), ans.end(), cmp);
	for(int i = 0; i < ans.size(); i ++) {
		if(i != 0) {
			cout << " ";
		}
		cout << ans[i].value;
	}
	return 0;
}
 

以上是关于PAT Tree Traversals (25) [⼆叉树的遍历,后序中序转层序] HERODING的PAT之路的主要内容,如果未能解决你的问题,请参考以下文章