试题 算法训练 绘制地图
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情:
1.WYF的点卡工厂构成一颗二叉树。
2.一共有n座工厂。
3.他需要把这颗树上的点以后序遍历的方法列出来,才能绘制地图。
还好,最近他的属下给了他先序遍历和中序遍历的数据。可是,氰垃圾最近还要帮㊎澤穻解决一些问题,没有时间。请你帮帮他,替他完成这项任务。由于氰垃圾的一些特殊的要求,WYF的参观路线将会是这棵树的后序遍历。输入格式
第一行一个整数n,表示一共又n座工厂。
第二行n个整数,表示先序遍历。
第三行n个整数,表示中序遍历。输出格式
输出共一行,包含n个整数,为后序遍历。
样例输入
8
1 2 4 5 7 3 6 8
4 2 7 5 1 8 6 3样例输出
4 7 5 2 8 6 3 1
数据规模和约定
0<n<100000,。保证先序遍历和中序遍历合法,且均为1~n。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
unordered_map<int, int> index;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(NULL), right(NULL) {}
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
TreeNode(int x, TreeNode *left, TreeNode *right){
this->val = val;
this->left = left;
this->right = right;
}
};
TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right){
if (pre_left > pre_right){
return NULL;
}
int pre_root = pre_left;
int in_root = index[preorder[pre_root]];
TreeNode* root = new TreeNode(preorder[pre_root]);
int size_left_subTree = in_root - in_left;
root->left = myBuildTree(preorder, inorder, pre_left+1, pre_left+size_left_subTree, in_left, in_root-1);
root->right = myBuildTree(preorder, inorder, pre_left+size_left_subTree+1, pre_right, in_root+1, in_right);
return root;
}
void backTraverse(TreeNode* root, vector<int>& res){
if(root == NULL){
return ;
}
backTraverse(root->left, res);
backTraverse(root->right, res);
res.push_back(root->val);
}
int main() {
int n;
cin >> n;
vector<int> preorder(n);
vector<int> inorder(n);
for(int i = 0; i < n; i++){
cin >> preorder[i];
}
for(int i = 0; i < n; i++){
cin >> inorder[i];
}
for(int i = 0; i < n; i++){
index[inorder[i]] = i;
}
TreeNode* root = myBuildTree(preorder, inorder, 0, n-1, 0, n-1);
vector<int> res;
backTraverse(root, res);
for(int i = 0; i < n; i ++){
cout << res[i] << " ";
}
return 0;
}