Construct Binary Tree from Preorder and Inorder Traversal

medium tree recursion

Problem

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

The first preorder element is always the current root. Find that value's position in the inorder array — everything to its left forms the left subtree, everything to its right forms the right subtree. Recurse with the matching slices of preorder.

Inputpreorder = [3, 9, 20, 15, 7], inorder = [9, 3, 15, 20, 7]
Outputlevel-order: [3, 9, 20, _, _, 15, 7]

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