描述

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7] 返回如下二叉树: 3
/ \
9 20
/ \
15 7


题解

前序遍历:先输出父节点,再遍历左子树和右子树
中序遍历:先遍历左子树,再输出父节点,最后遍历右子树
后序遍历:先遍历左子树,再遍历右子树,最后输出父节点
小结:看输出父节点的顺序,就确定是前序、中序,还是后序
这道题的思路来源于B站up小美算法的这个视频

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {number[]} preorder
  11. * @param {number[]} inorder
  12. * @return {TreeNode}
  13. */
  14. var buildTree = function(preorder, inorder) {
  15. if (!preorder.length) return null
  16. // 前序数组的第一个值就是根节点
  17. let root = new TreeNode(preorder[0])
  18. // 找到根节点在中序数组里的索引
  19. let index = inorder.findIndex(item => item === root.val)
  20. root.left = buildTree(preorder.slice(1, index + 1), inorder.slice(0, index))
  21. root.right = buildTree(preorder.slice(index + 1, preorder.length), inorder.slice(index + 1, inorder.length))
  22. return root
  23. };