106. Construct Binary Tree from Inorder and Postorder Traversal - cocoder39/coco39_LC GitHub Wiki

106. Construct Binary Tree from Inorder and Postorder Traversal

dfs: O(n) time and O(n) space

class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        unordered_map<int, int> map; 
        for (int i = 0; i < inorder.size(); i++) {
            map[inorder[i]] = i;
        }
        
        return helper(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1, map);
    }
private:
    TreeNode* helper(vector<int>& inorder, int in_sta, int in_end, vector<int>& postorder, int pos_sta, int pos_end, unordered_map<int, int>& map) {
        if (in_sta > in_end || pos_sta > pos_end) {
            return nullptr;
        }
        
        int in_root = map[postorder[pos_end]];
        int pos_sta_left = pos_sta;
        int pos_end_left = pos_sta_left + (in_root - 1 - in_sta);
        int pos_sta_right = pos_end_left + 1;
        int pos_end_right = pos_end - 1;
        
        TreeNode* root = new TreeNode(postorder[pos_end]);
        root->left = helper(inorder, in_sta, in_root - 1, postorder, pos_sta_left, pos_end_left, map);
        root->right = helper(inorder, in_root + 1, in_end, postorder, pos_sta_right, pos_end_right, map);
        return root;
    }
};
⚠️ **GitHub.com Fallback** ⚠️