版权声明:转载请注明出处: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;
}