题目地址(07. 重建二叉树)

https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
同105

题目描述

  1. 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
  2. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
  3. 示例 1:
  4. Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
  5. Output: [3,9,20,null,null,15,7]
  6. 示例 2:
  7. Input: preorder = [-1], inorder = [-1]
  8. Output: [-1]
  9. 限制:
  10. 0 <= 节点个数 <= 5000
  11. 注意:本题与主站 105 题重复:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

前置知识


公司

  • 暂无

思路

关键点


代码

  • 语言支持:Java

Java Code:

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public TreeNode buildTree(int[] preorder, int[] inorder) {
  12. return loop(preorder , 0 , preorder.length-1 , inorder , 0, inorder.length-1);
  13. }
  14. TreeNode loop(int[] preorder , int preLeft , int preRight,
  15. int[] inorder , int inLeft , int inRight){
  16. //递归的终止条件
  17. if (preLeft > preRight) {
  18. return null;
  19. }
  20. //找到根节点 也就是前序遍历的第一个
  21. int mid = preorder[preLeft];
  22. TreeNode root = new TreeNode(mid);
  23. //找到中序遍历的根节点的位置
  24. int index = 0;
  25. for (int i = inLeft; i <= inRight; i++) {
  26. if (inorder[i] == mid) {
  27. index = i;
  28. break;
  29. }
  30. }
  31. //算出左子树的大小
  32. int leftSize = index - inLeft;
  33. //根据中序的中间位置 将中序分成左右两颗子树
  34. root.left = loop(preorder, preLeft + 1, preLeft + leftSize, inorder, inLeft, index - 1);
  35. root.right = loop(preorder, preLeft + leftSize + 1, preRight, inorder, index +1, inRight);
  36. return root;
  37. }
  38. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:剑指 Offer 07. 重建二叉树 - 图1#card=math&code=O%28n%29&id=cYywi)
  • 空间复杂度:剑指 Offer 07. 重建二叉树 - 图2#card=math&code=O%28n%29&id=gav1g)