PTAL2-006 树的遍历解题报告---后序遍历,中序遍历得到层序遍历

版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/85159413

                                       L2-006 树的遍历 (25 分)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

 最近在狂补数据结构,大一数据结构落下了太多

AC Code: 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<cctype>
#include<map>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<set>
#define INF 0x3f3f3f3f
using namespace std;
static const int MAX_N = 1e5 + 5;
typedef long long ll;
int post[35], in[35];
map<int, int>L, R;
int build(int p1, int p2, int in1, int in2) {
	if (p1 > p2) return 0;
	int root = post[p2];	//根节点
	int i = in1;
	while (in[i] != root && i <= in2) i++;	//中序遍历中找根节点
	if (i <= in2) {
		R[root] = build(p2 - in2 + i, p2 - 1, i + 1, in2);	//左子树
		L[root] = build(p1, p2 - in2 + i - 1, in1, i - 1);	//右子树
	}
	return root;
}
void bfs(int root) {	//层序遍历
	queue<int> Q;
	Q.push(root);
	bool flag = true;
	while (!Q.empty()) {
		int v = Q.front();
		Q.pop();
		if (flag) {
			printf("%d", v);
			flag = false;
		}
		else printf(" %d", v);
		if (L[v]) Q.push(L[v]);
		if (R[v]) Q.push(R[v]);
	}
	putchar('\n');
}
int main(){
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &post[i]);
	}
	for (int i = 0; i < n; i++) {
		scanf("%d", &in[i]);
	}
	int root = build(0, n - 1, 0, n - 1);
	bfs(root);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/85159413
今日推荐