问题 C: 还原二叉树
时间限制: 1 Sec
内存限制: 128 MB
提交: 327
解决: 158
提交
状态
题目描述
给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。
输入
每个输入文件中一组数据。
第一行一个正整数N(1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。
输出
输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。每行末尾不输出额外的空格。
样例输入
73 5 4 2 6 7 12 5 3 6 4 7 1
样例输出
3 5 2 4 6 7 12 5 6 1 7 4 3
题目链接:点击打开链接
卡了真久,开始自己写,整整两个钟都没AC,整个人心情都不好了,还是自己太菜了。参考了晴神代码,点击打开链接,也算作一次总结吧!!
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <algorithm>
#include <stack>
#include <cstring>
#include <set>
#include <map>
using namespace std;
const int maxn = 30;
int n;
vector<int> lev_order, in_order;
bool temp_vis[maxn];
struct Node {
int data;
Node *left;
Node *right;
Node() {
left = NULL;
right = NULL;
}
};
Node *build(vector<int> lev, int left, int right) {
if (lev.size() == 0) return NULL;
Node *temp = new Node();
temp->data = lev[0];
int pos;
for (int i = left; i <= right; i++) {
if (lev[0] == in_order[i]) {
pos = i;
break;
}
}
int left_b = left;
int right_b = pos - 1;
memset(temp_vis, false, sizeof(temp_vis));
for (int i = left_b; i <= right_b; i++) {
temp_vis[in_order[i]] = true; // 访问中序数组的左子树
}
vector<int> temp_left, temp_right;
for (int i = 1; i < lev.size(); i++) {
if (temp_vis[lev[i]]) {
temp_left.push_back(lev[i]); // 从层次遍历中选出左子树
} else {
temp_right.push_back(lev[i]); // 从层次遍历中选出右子树
}
}
temp->left = build(temp_left, left, right_b);
temp->right = build(temp_right, pos + 1, right);
return temp;
}
vector<int> ans_pre;
void visit_pre(Node *&root) {
if (root == NULL) return;
ans_pre.push_back(root->data);
visit_pre(root->left);
visit_pre(root->right);
}
vector<int> ans_pos;
void visit_pos(Node *&root) {
if (root == NULL) return;
visit_pos(root->left);
visit_pos(root->right);
ans_pos.push_back(root->data);
}
void print_ans(vector<int> &ans) {
for (int i = 0; i < n; i++) {
cout << ans[i];
if (i != n - 1) cout << " ";
}
cout << endl;
}
int main() {
int x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
lev_order.push_back(x);
}
for (int i = 0; i < n; i++) {
cin >> x;
in_order.push_back(x);
}
Node *root = build(lev_order, 0, n - 1);
visit_pre(root);
visit_pos(root);
print_ans(ans_pre);
print_ans(ans_pos);
return 0;
}