class Solution {
    
    int post_idx;
    
    unordered_map<int, int>umap;
public:
    TreeNode* helper(int in_left, int in_right, vector<int>& inorder, vector<int>& postorder){
        
        if(in_left > in_right) return nullptr;
        int root_val = postorder[post_idx];
        
        TreeNode* root = new TreeNode(root_val);
        int index = umap[root_val];
        post_idx--;
        
        root->right = helper(index + 1, in_right, inorder, postorder);
        
        root->left = helper(in_left, index - 1, inorder, postorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        
        post_idx = postorder.size() - 1;
        
        int idx = 0;
        for(auto& innode : inorder){
            umap[innode] = idx++;
        }
        
        return helper(0, postorder.size() - 1, inorder, postorder);
    }
};