- Published on
[LeetCode 105] Construct Binary Tree from Preorder and Inorder Traversal
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.
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.
TypeScript
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
// inorder
const inorderValueToIndex: {[index: number]: number} = {}
for(let i = 0; i < inorder.length; i++){
inorderValueToIndex[inorder[i]] = i;
}
// preorder
let preorderIndex: number = 0;
// build tree with left, right in inorder array
// & preorder index
const build = (left: number, right: number): TreeNode => {
// base case
if(left > right) {
return null;
}
// recursion case
const rootValue: number = preorder[preorderIndex]
const root: TreeNode = new TreeNode(rootValue);
preorderIndex++;
const mid: number = inorderValueToIndex[rootValue]
root.left = build(left, mid - 1);
root.right = build(mid + 1, right);
return root;
}
return build(0, inorder.length - 1);
};