核心思想:
通过前序遍历知道根节点,再到中序遍历中找到根节点,左边就是左子树,右边就是右子树,每一次递归都对前序遍历的第一个数new TreeNode()
代码中的rootIndex就是根节点序号。
同时也代表着左子树宽度为rootIndex,所以左子树中前序遍历数组slice就是从第二个点开始
,往后走rootIndex个数,因为尾部是开区间,所以+1。同理右子树的前序遍历数组slice从1+rootIndex开始。
中序遍历数组slice同理,因为从0开始所以左子树尾部就是rootIndex,右子树从rootIndex+1开始
var buildTree = function(preorder, inorder) {
if(preorder.length ===0 || inorder.length ===0) return null
let root = new TreeNode(preorder[0])
let rootIndex = inorder.findIndex((item)=>{return root.val === item})
root.left = buildTree(preorder.slice(1,rootIndex+1), inorder.slice(0,rootIndex))
root.right = buildTree(preorder.slice(1+rootIndex), inorder.slice(rootIndex+1))
return root
};