105.前序中序构建二叉树
这里的是用中序还有后序构建二叉树
- 前序:根左右
- 中序:左根右
- 后序:左右根
搞清楚这里的遍历顺序之后,就可以从后序的尾部拿到根节点了
然后在中序遍历中查找根节点在哪里,然后就可以根据中序遍历分为左右子树了
拿这里的例子来说,根节点是3,那么在中序中可以看到3的左边[9]是左子树,3的右边[15,20,7]是右子树
在后序遍历中,我们可以看到左子树部分是开头[9](后序遍历的开始就是左子树),所以我们在后序中可以找到在右边的部分就是排开了左子树[9]以及根节点[3],剩下的部分就是右子树[15,7,20],然后依次递归即可
var buildTree = function (inorder, postorder) {
if (inorder.length === 0 && postorder.length === 0) return null
let node = postorder[postorder.length - 1]
let index = inorder.indexOf(node)
let root = new TreeNode(node)
// 中序的开始部分,以及后序的开始部分都是左子树
root.left = buildTree(inorder.slice(0, index), postorder.slice(0, index))
// 中序的后半部分就是右子树,也就是排开了index部分(根节点)
// 后序的右子树部分就是排开了左子树以及结尾部分的根节点
root.right = buildTree(inorder.slice(index + 1), postorder.slice(index, postorder.length - 1))
return root
};