L2-011. 玩转二叉树

来源:互联网 发布:gre单词软件 编辑:程序博客网 时间:2024/06/10 22:17

L2-011. 玩转二叉树

https://www.patest.cn/contests/gplt/L2-011

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

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

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

输出格式:

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

输入样例:
71 2 3 4 5 6 74 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2

#include <iostream>#include <algorithm>#include <cstring>#include <functional>#include <cstdio>#include <vector>#include <queue>using namespace std;typedef long long ll;const int MAXN = 35;int preOrder[MAXN];int inOrder[MAXN];vector<vector<int> >order(MAXN);//order[i]保存了层序遍历中第i层的结果void rebuild(int preL, int inL, int n, int c){if (n == 0)return;order[c].push_back(preOrder[preL]);if (n == 1)return;int i;for (i = 0; i < n; ++i)if (preOrder[preL] == inOrder[inL + i])break;rebuild(preL + i + 1, inL + i + 1, n - i - 1, c + 1);rebuild(preL + 1, inL, i, c + 1);}int main(){freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);ios::sync_with_stdio(false);cin.tie(0);int n;while (cin >> n){for (int i = 0; i < n; ++i)cin >> inOrder[i];for (int i = 0; i < n; ++i)cin >> preOrder[i];order.clear();order.resize(35);rebuild(0, 0, n, 1);bool flag = false;for (int i = 0; i <= 30; ++i){if (order[i].size() == 0)continue;for (int j = 0; j < order[i].size(); ++j){if (flag == false)flag = true;elsecout << " ";cout << order[i][j];}}cout << endl;}return 0;}