解法:递归法
思路:根据前序列表的第0项可以得知二叉树的root,根据root可以找到中序遍历的里左右树的边界(前序【0】节点的元素),可以分别获得前序遍历的左右树和中序遍历的左右树。构造出当前节点的二叉树,递归知道前序遍历不在有值,返回null
var buildTree = function(preorder, inorder) {
return deepTree(preorder, inorder)
};
// 递归构建每一个节点的树
function deepTree(preorder, inorder) {
if (!preorder.length) return null
// 跟节点
let root = new TreeNode(preorder[0])
// 从中序节点中找到root节点,划分左右树
let p = 0
while(inorder[p] !== preorder[0]) {
p++
}
// 当前节点的中序左树
let middleLeft = inorder.slice(0, p)
// 当前节点的中序右树
let middleRight = inorder.slice(p+1)
// 当前节点的前序左树
let preLeft = preorder.slice(1, p+1)
// 当前节点的前序右树
let preRight = preorder.slice(p+1)
// 构建左树
root.left = deepTree(preLeft, middleLeft)
// 构建右树
root.right = deepTree(preRight, middleRight)
return root
}