/**
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) {
if (!inorder || !preorder || inorder.length !== preorder.length) {
return null
}
// 根据前序遍历去获取根节点,根据中序遍历去确定左子树和右子树
// 记录中序遍历,各个节点的index, 确定左子树 右子树
// 先用map记录中序遍历中各个nod的索引
const map = {}
for (var i = 0; i < inorder.length; i++) {
map[inorder[i]] = i
}
var idx = 0
// 先序遍历开始
const fn = (l, r) => {
// 注意边界
if (l > r) return null
const val = preorder[idx++]
var root = new TreeNode(val)
var rootIdxInorder = map[val]
root.left = fn(l, rootIdxInorder - 1)
root.right = fn(rootIdxInorder + 1, r)
return root
}
return fn(0, preorder.length - 1)
}
对应lc 第105题。