#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
int find_index(const vector<int>& vec, const int target){
for(int i = 0; i < vec.size(); i++){
if(vec[i] == target){
return i;
}
}
return -1;
}
TreeNode* construct(vector<int>& pre, int ps, int pe, vector<int>& vin, int vs, int ve){
if(ps > pe) return nullptr;
int value = pre[ps];
int index = find_index(vin, value);
auto node = new TreeNode(value);
node->left = construct(pre, ps+1, ps + index - vs, vin, vs, index-1);
node->right = construct(pre, ps + index - vs + 1, pe, vin, index + 1, ve);
return node;
}
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
if(pre.empty() || vin.empty() || pre.size() != vin.size()){
return nullptr;
}
return construct(pre, 0, pre.size()-1, vin, 0, vin.size()-1);
}
};
void post_order(TreeNode* root){
if(root == nullptr){
return;
}
post_order(root->left);
post_order(root->right);
cout << root->val << ", ";
}
int main() {
Solution s;
vector<int> pre = {1,2,4,7,3,5,6,8};
vector<int> vin = {4,7,2,1,5,3,8,6};
auto t = s.reConstructBinaryTree(pre, vin);
post_order(t);
return 0;
}