剑指 Offer 07. 重建二叉树

和力扣 105. 从前序与中序遍历序列构造二叉树一致

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:
剑指 07. 重建二叉树 👌 - 图1
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

  1. //递归法,时空都是On
  2. func buildTree(preorder []int, inorder []int) *TreeNode {
  3. if len(preorder) == 0 || len(inorder) == 0 {
  4. return nil
  5. }
  6. root := &TreeNode{preorder[0], nil, nil} //1,根据前序,找到根节点,化为三部分
  7. i := 0
  8. for i = 0; i < len(inorder); i++ {
  9. if inorder[i] == preorder[0] { //2,中序遍历,找到每层的root
  10. break
  11. }
  12. }
  13. root.Left = buildTree(preorder[1: len(inorder[: i]) + 1], inorder[: i])
  14. root.Right = buildTree(preorder[len(inorder[: i]) +1 : ], inorder[i+1: ])
  15. return root
  16. }