【leetcode】106.从中序与后序遍历序列构造二叉树

85 阅读1分钟

image.png

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
};