代码如下:
#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;
}
没什么特别的,就是把二叉树的重建问题和层次遍历合成了一个问题。