【PAT甲級題解】1020 Tree Traversals
阿新 • • 發佈:2018-12-12
程式碼如下:
#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; }
沒什麼特別的,就是把二叉樹的重建問題和層次遍歷合成了一個問題。