Construct Binary Search Tree from Preorder Traversal

medium tree bst

Problem

Given the preorder traversal of a BST with distinct values, reconstruct the tree.

Inputpreorder = [8,5,1,7,10,12]
Output[8,5,10,1,7,null,12]
Recurse with an upper bound; consume values that respect it, recurse into left then right.

def bstFromPreorder(preorder):
    i = 0
    def build(bound):
        nonlocal i
        if i == len(preorder) or preorder[i] > bound: return None
        node = TreeNode(preorder[i]); i += 1
        node.left = build(node.val)
        node.right = build(bound)
        return node
    return build(float('inf'))
function bstFromPreorder(preorder) {
  let i = 0;
  function build(bound) {
    if (i === preorder.length || preorder[i] > bound) return null;
    const node = { val: preorder[i++], left: null, right: null };
    node.left = build(node.val);
    node.right = build(bound);
    return node;
  }
  return build(Infinity);
}
class Solution {
    int i = 0; int[] pre;
    public TreeNode bstFromPreorder(int[] preorder) { pre = preorder; return build(Integer.MAX_VALUE); }
    TreeNode build(int bound) {
        if (i == pre.length || pre[i] > bound) return null;
        TreeNode node = new TreeNode(pre[i++]);
        node.left = build(node.val);
        node.right = build(bound);
        return node;
    }
}
int idx = 0;
TreeNode* build(vector<int>& pre, int bound) {
    if (idx == (int)pre.size() || pre[idx] > bound) return nullptr;
    TreeNode* node = new TreeNode(pre[idx++]);
    node->left = build(pre, node->val);
    node->right = build(pre, bound);
    return node;
}
TreeNode* bstFromPreorder(vector<int>& preorder) { idx = 0; return build(preorder, INT_MAX); }
Time: O(n) Space: O(h)