Construct Binary Tree from Inorder and Postorder Traversal

medium tree recursion

Problem

Given two integer arrays inorder and postorder where inorder is the inorder traversal of a binary tree and postorder is the postorder traversal of the same tree, construct and return the binary tree.

The last postorder element is always the current root. Find that value's position in the inorder array — left side becomes the left subtree, right side the right subtree. Recurse from the back of postorder, building the right subtree before the left.

Inputinorder = [9, 3, 15, 20, 7], postorder = [9, 15, 7, 20, 3]
Outputlevel-order: [3, 9, 20, _, _, 15, 7]

def build_tree(inorder, postorder):
    pos = {v: i for i, v in enumerate(inorder)}
    pi = [len(postorder) - 1]
    def rec(lo, hi):
        if lo > hi: return None
        v = postorder[pi[0]]; pi[0] -= 1
        node = TreeNode(v)
        m = pos[v]
        node.right = rec(m + 1, hi)
        node.left = rec(lo, m - 1)
        return node
    return rec(0, len(inorder) - 1)
function buildTree(inorder, postorder) {
  const pos = new Map();
  inorder.forEach((v, i) => pos.set(v, i));
  let pi = postorder.length - 1;
  function rec(lo, hi) {
    if (lo > hi) return null;
    const v = postorder[pi--];
    const node = { val: v, left: null, right: null };
    const m = pos.get(v);
    node.right = rec(m + 1, hi);
    node.left = rec(lo, m - 1);
    return node;
  }
  return rec(0, inorder.length - 1);
}
class Solution {
    int pi;
    Map<Integer,Integer> pos = new HashMap<>();
    int[] post;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        post = postorder; pi = postorder.length - 1;
        for (int i = 0; i < inorder.length; i++) pos.put(inorder[i], i);
        return rec(0, inorder.length - 1);
    }
    TreeNode rec(int lo, int hi) {
        if (lo > hi) return null;
        int v = post[pi--];
        TreeNode node = new TreeNode(v);
        int m = pos.get(v);
        node.right = rec(m + 1, hi);
        node.left = rec(lo, m - 1);
        return node;
    }
}
int pi;
unordered_map<int,int> pos;
vector<int> post_;
TreeNode* rec(int lo, int hi) {
    if (lo > hi) return nullptr;
    int v = post_[pi--];
    auto node = new TreeNode(v);
    int m = pos[v];
    node->right = rec(m + 1, hi);
    node->left = rec(lo, m - 1);
    return node;
}
Time: O(n) with hash lookup Space: O(n)