Skip to main content

Construct Binary Tree from Inorder and Postorder Traversal

Problem statement

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

Example 1:

Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]Output: [3,9,20,null,null,15,7]

Example 2:

Input: inorder = [-1], postorder = [-1]Output: [-1]

Constraints:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorder and postorder consist of unique values.
  • Each value of postorder also appears in inorder.
  • inorder is guaranteed to be the inorder traversal of the tree.
  • postorder is guaranteed to be the postorder 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[]} inorder
* @param {number[]} postorder
* @return {TreeNode}
*/
const map = new Map()
var buildTree = function(inorder, postorder) {
const len = inorder.length
for (let i = 0; i < inorder.length; i++) {
map.set(inorder[i], i)
}
const root = traverse(inorder, postorder, 0, len - 1, 0, len - 1)
return root
};

function traverse(inOrder, postOrder, inOrderStart, inOrderEnd, postOrderStart, postOrderEnd) {
if (inOrderStart > inOrderEnd) {
return null
}

const node = new TreeNode(postOrder[postOrderEnd])

if (inOrderStart === inOrderEnd) {
return node;
}

const idx = map.get(node.val);

node.left = traverse(inOrder, postOrder, inOrderStart, idx - 1, postOrderStart, postOrderStart - inOrderStart + idx - 1)

node.right = traverse(inOrder, postOrder, idx + 1, inOrderEnd, postOrderEnd - inOrderEnd + idx, postOrderEnd - 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;
}