class Solution {
public:
unordered_map<int, int> pos;
vector<int> preorder, inorder;
TreeNode* buildTree(vector<int>& _preorder, vector<int>& _inorder) {
preorder = _preorder, inorder = _inorder;
int n = inorder.size();
for(int i = 0; i < n ; i ++) pos[inorder[i]] = i;
return build(0, n - 1, 0, n - 1);
}
TreeNode* build(int a, int b, int x, int y) {
if(a > b) return nullptr;
auto root = new TreeNode(preorder[a]);
int k = pos[root->val];
root->left = build(a + 1, a + k - x, x, k - 1);
root->right = build(a + k - x + 1, b, k + 1, y);
return root;
}
};
class Solution {
public:
vector<int> inorder, postorder;
unordered_map<int, int> pos;
TreeNode* buildTree(vector<int>& _inorder, vector<int>& _postorder) {
inorder = _inorder, postorder = _postorder;
int n = inorder.size();
for(int i = 0; i < n ; i ++) pos[inorder[i]] = i;
return build(0, n - 1, 0, n - 1);
}
TreeNode* build(int a, int b, int x, int y) {
if(a > b) return nullptr;
auto root = new TreeNode(postorder[b]);
int k = pos[root->val];
root->left = build(a, k - x + a - 1, x, k - 1);
root->right = build(k - x + a , b - 1, k + 1, y);
return root;
}
};