Construct Binary Tree from Preorder and Inorder Traversal
Problem statement
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.
Example 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]
Example 2:
Input: preorder = [-1], inorder = [-1]Output: [-1]
Constraints:
1 <= preorder.length <= 3000inorder.length == preorder.length-3000 <= preorder[i], inorder[i] <= 3000preorderandinorderconsist of unique values.- Each value of
inorderalso appears inpreorder. preorderis guaranteed to be the preorder traversal of the tree.inorderis guaranteed to be the inorder traversal of the tree.
My solution
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
var buildTree = function(preorder, inorder) {
const inOrderLength = inorder.length - 1;
let root = traverse(inorder, preorder, 0, inOrderLength, 0)
return root;
};
// 0 0 4 => 1 => 0 0 | 2 4 | 0 + 1 - 0 + 1
//
function traverse(inOrder, preOrder, inOrderStart, inOrderEnd, preIndex) {
// console.log(inOrderStart, inOrderEnd, preIndex)
if (inOrderStart > inOrderEnd || preIndex > preOrder.length - 1) {
return null;
}
const node = new TreeNode(preOrder[preIndex])
// console.log(node.val)
if (inOrderStart === inOrderEnd) {
return node
}
const idx = search(inOrder, inOrderStart, inOrderEnd, node.val)
node.left = traverse(inOrder, preOrder, inOrderStart, idx - 1, preIndex + 1)
node.right = traverse(inOrder, preOrder, idx + 1, inOrderEnd, preIndex + idx - inOrderStart + 1)
return node
}
function search(inOrder, left, right, target) {
let i;
for (i = left; i <= right; i++) {
if (inOrder[i] === target) {
return i
}
}
return i;
}