function TreeNode(val, left, right) {
this.val = (val === undefined ? 0 : val)
this.left = (left === undefined ? null : left)
this.right = (right === undefined ? null : right)
}
var buildTree = function (preorder, inorder) {
if (preorder.length === 0) {
return null
}
const rootVal = preorder[0]
const root = new TreeNode(rootVal)
let rootIndex
for (let i = 0; i < inorder.length; i++) {
if (inorder[i] === root.val) {
rootIndex = i
break
}
}
const leftInorder = inorder.slice(0, rootIndex)
const rightInorder = inorder.slice(rootIndex + 1)
const leftPreorder = []
const rightPreorder = []
for (let i = 0; i < preorder.length; i++) {
if (leftInorder.includes(preorder[i])) {
leftPreorder.push(preorder[i])
continue
}
if (rightInorder.includes(preorder[i])) {
rightPreorder.push(preorder[i])
continue
}
}
root.left = buildTree(leftPreorder, leftInorder)
root.right = buildTree(rightPreorder, rightInorder)
return root
};
var buildTree = function (preorder, inorder) {
let inorderMap = {}
for (let i = 0; i < inorder.length; i++) {
inorderMap[inorder[i]] = i
}
function build(preorderStartIndex, preorderEndIndex, inorderStartIndex, inorderEndIndex) {
if (preorderStartIndex > preorderEndIndex) {
return null
}
const preorderRootIndex = preorderStartIndex
const inorderRootIndex = inorderMap[preorder[preorderRootIndex]]
const root = new TreeNode(preorder[preorderRootIndex])
const leftSubTreeSize = inorderRootIndex - inorderStartIndex
const leftInorderStartIndex = inorderStartIndex
const leftInorderEndIndex = inorderRootIndex - 1
const rightInorderStartIndex = inorderRootIndex + 1
const rightInorderEndIndex = inorderEndIndex
const leftPreorderStartIndex = preorderRootIndex + 1
const leftPreorderEndIndex = (leftPreorderStartIndex + leftSubTreeSize) - 1
const rightPreorderStartIndex = leftPreorderEndIndex + 1
const rightPreorderEndIndex = preorderEndIndex
root.left = build(leftPreorderStartIndex, leftPreorderEndIndex, leftInorderStartIndex, leftInorderEndIndex)
root.right = build(rightPreorderStartIndex, rightPreorderEndIndex, rightInorderStartIndex, rightInorderEndIndex)
return root
}
let n = preorder.length
return build(0, n - 1, 0, n - 1)
}