【蓝桥杯】ALGO-380 绘制地图

试题 算法训练 绘制地图

资源限制

时间限制: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44566432/article/details/114930975