1. 程式人生 > >【PAT甲級題解】1020 Tree Traversals

【PAT甲級題解】1020 Tree Traversals

程式碼如下:

#include <iostream>
#include <stack>
#include <queue>
#include <vector>

using namespace std;

struct TreeNode{
	int val_;
	TreeNode* left_;
	TreeNode* right_;
	TreeNode(int val):val_(val), left_(NULL), right_(NULL){}
};

TreeNode* reconstructTree(vector<int>& post, int ps, int pe, vector<int>& in, int is, int ie){
	if(is > ie || ps > pe) return NULL;
	TreeNode* root = new TreeNode(post[pe]);
	for(int i = is; i <= ie; i++){
		if(in[i] == post[pe]){
			root->left_=reconstructTree(post, ps, pe - ie + i - 1, in, is, i - 1);
			root->right_=reconstructTree(post, pe - ie + i, pe - 1, in, i + 1, ie);
		}
	}
	return root;
}

void levelOrder(TreeNode* root, int N){
	int cnt = 1; // use cnt to control format
	queue<TreeNode*> q;
	if(root != NULL) q.emplace(root);
	while(!q.empty()){
		TreeNode* tmp = q.front();
		q.pop();
		if(cnt < N)
			cout << tmp->val_ << " ";
		else
			cout << tmp->val_ << endl;
		cnt++;
		
		if(tmp->left_) q.emplace(tmp->left_);
		if(tmp->right_) q.emplace(tmp->right_);
	}
}

int main(){
	int  N; // total number of nodes the the tree
	vector<int> post; // post-order traversal sequence
	vector<int> in; // in-order traversal sequence
	
	// read inputs
	cin >> N;
	for(int i = 0; i < N; i++){
		int elem;
		cin >> elem;
		post.emplace_back(elem);
	}
	for(int i = 0; i < N; i++){
		int elem;
		cin >> elem;
		in.emplace_back(elem);
	}
	
	// reconstruct tree
	TreeNode* root = reconstructTree(post, 0, N-1, in, 0, N-1);
	
	// begin level traversal
	levelOrder(root, N);
	
	return 0;
}

沒什麼特別的,就是把二叉樹的重建問題和層次遍歷合成了一個問題。