题目描述
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入
输入第一行给出一个正整数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
题意
由中序遍历与后序遍历可以建立出这个树,然后对这个树进行BFS就可以得到层次遍历了QAQ
AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define LL long long
#define CLR(a,b) memset(a,(b),sizeof(a))
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+11;
struct node {
int l, r;
int id, h;
}tree[MAXN];
int n, len;
int arr[MAXN], brr[MAXN];
int find(int l, int r, int root) {
for(int i = l; i <= r; i++) {
if(brr[i] == root) return i;
}
}
void build(int l, int r, int root, int u) {
if(l > r) return ;
int k = find(l,r,arr[root]);
if(l < k) {
tree[++len].id = arr[root-(r-k)-1];
tree[len].h = tree[u].h+1;
tree[u].l = len;
build(l,k-1,root-(r-k)-1,len);
}
if(r > k) {
tree[++len].id = arr[root-1];
tree[len].h = tree[u].h+1;
tree[u].r = len;
build(k+1,r,root-1,len);
}
return ;
}
void bfs() {
queue<int> que;
que.push(1);
while(!que.empty()) {
int k = que.front();
if(tree[k].l != -1) que.push(tree[k].l);
if(tree[k].r != -1) que.push(tree[k].r);
if(n > 1)
cout << tree[k].id << " ";
else
cout << tree[k].id << endl;
n--;
que.pop();
}
return ;
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++ )
cin >> arr[i];
for(int i = 1; i <= n; i++ )
cin >> brr[i];
for(int i = 1; i <= n; i++) {
tree[i].id = 0;
tree[i].l = -1;
tree[i].r = -1;
tree[i].h = 0;
}
len = 1;
tree[1].id = arr[n];
tree[1].h = 1;
build(1,n,n,1);
bfs();
return 0;
}