Skip to main content

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 <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder and inorder consist of unique values.
  • Each value of inorder also appears in preorder.
  • preorder is guaranteed to be the preorder traversal of the tree.
  • inorder is 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;
}