团体程序设计天梯赛-练习集 L2-006 树的遍历 根据后序中序建树+BFS

来源:互联网 发布:c语言的广泛应用 编辑:程序博客网 时间:2024/05/01 01:09

L2-006. 树的遍历

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

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

输入格式:

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

输出格式:

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

输入样例:
72 3 1 5 7 6 41 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2


#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <algorithm>#include <queue>using namespace std;const int maxn = 30;int a[maxn + 10], b[maxn + 10];map<int, int>L, R; //L[i]表示i的左子节点,R[i]表示i的右子节点//当前考虑的是后序遍历[la, ra]区间和对应的中序遍历[lb,rb]区间int build(int la, int ra, int lb, int rb) {if (la > ra) { //越界判断return 0;}int root = a[ra]; //后序遍历右一肯定是根int i;for (i = lb; i <= rb && b[i] != root; i++) {} //在中序遍历中找到这个节点下标iif (i <= rb) { //递归分治R[root] = build(ra - rb + i, ra - 1, i + 1, rb);L[root] = build(la, ra - rb + i - 1, lb, i - 1);}return root;}void bfs(int root) {queue<int> Q;Q.push(root);int cnt = 0;while (!Q.empty()) {int tn = Q.front(); Q.pop();printf(cnt++ == 0 ? "%d" : " %d", tn);if (L[tn]) {Q.push(L[tn]);}if (R[tn]) {Q.push(R[tn]);}}puts("");}int main(){int N;scanf("%d", &N);for (int i = 1; i <= N; i++) {scanf("%d", &a[i]);}for (int i = 1; i <= N; i++) {scanf("%d", &b[i]);}int root = build(1, N, 1, N);bfs(root);return 0;}




0 0
原创粉丝点击