Rebuild Tree From Inorder and Postorder

medium tree recursion

Problem

Given a tree's inorder and postorder traversals (with distinct values), reconstruct the 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)