L2-011 玩转二叉树 (25 分)
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N
(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
代码思路同L2-006树的遍历几乎一样,只是转变了入队的顺序。
https://blog.csdn.net/qq_40946921/article/details/88065631
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct Order {
vector<int> pre, mid; //存储遍历顺序
};
void creat(Order order) {
queue<Order> tree;
tree.push(order);
while (!tree.empty()) {
Order left,right;
int key = tree.front().pre.front(), flag = 0;
//print(tree.front());
for (int i = 0, j = 1; i < tree.front().mid.size() && j < tree.front().pre.size();) {
if (tree.front().mid[i] == key) {
i++; flag = 1;
}
else {
(flag ? right : left).mid.push_back(tree.front().mid[i++]);
(flag ? right : left).pre.push_back(tree.front().pre[j++]);
}
}
if (!right.pre.empty()) tree.push(right);
if (!left.pre.empty()) tree.push(left);
tree.pop();
cout << key << (tree.empty() ? "" : " ");
}
}
int main() {
int n, tmp;
Order order;
cin >> n;
for (int i = 0; i < 2 * n; i++) {
cin >> tmp;
(i < n ? order.mid : order.pre).push_back(tmp);
}
creat(order);
return 0;
}