【ブルーブリッジカップ】ALGO-380地図を描く

テスト質問アルゴリズムのトレーニングと地図の描画

リソース制限

制限時間:1.0秒メモリ制限:256.0MB

問題の説明

  最近、WYFは彼のカード工場を訪問する準備をしています。WYF Group Cyanide Wasteのマネージャーは、WYFが「ビュー」ルートを設計するのを支援する必要があります。現在、シアン化物廃棄物はいくつかのことを知ってい
  ます。1.WYFのポイントカードファクトリーは二分木を構成します。
  2.合計nの工場があります。
  3.彼は、マップを描画するためにメソッドをトラバースするために、ツリー上のポイントをリストする必要があります。
  幸いなことに、最近、彼の部下は彼に一次トラバーサルと中次トラバーサルのデータを提供しました。しかし、最近、シアン化物廃棄物は名沢がいくつかの問題を解決するのを助けなければならないので、時間がありません。彼を助け、彼のためにこのタスクを完了してください。シアン化物廃棄物のいくつかの特別な要件のために、WYFのツアールートはこの木のその後の横断になります。

入力フォーマット

  最初の行の整数nは、合計n個のファクトリを表します。
  2行目にはn個の整数があります。これは、事前順序走査を意味します。
  3行目の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