从前序与中序遍历序列构造二叉树

🎯 问题描述(来源于LeetCode)

描述:
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
说明:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

示例:

  • 示例 1:
1
2
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
  • 示例 2:
1
2
输入: preorder = [-1], inorder = [-1]
输出: [-1]

💻 解题思路

思路1:递归/分治

思路1:代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
def createTree(preorder, inorder, n):
if n == 0:
return None
idx=inorder.index(preorder[0])
node = TreeNode(inorder[idx])
node.left = createTree(preorder[1: idx + 1], inorder[0: idx], idx)
node.right = createTree(preorder[idx + 1:], inorder[idx + 1:], n - idx - 1)
return node
return createTree(preorder, inorder, len(inorder))

思路1:📊 性能分析

提交结果
  • 运行时间:99ms击败35.79%
  • 内存消耗:89.02MB击败21.08%
复杂度验证
  • 时间复杂度:O(N2)O(N^2)
  • 空间复杂度:O(N2)O(N^2)