给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder 和 inorder 均无重复元素
inorder 均出现在 preorder
preorder 保证为二叉树的前序遍历序列
inorder 保证为二叉树的中序遍历序列
前序遍历的第一个元素为根节点,而在中序遍历中,该根节点所在位置的左侧为左子树,右侧为右子树。
构建二叉树的问题本质上就是:
找到各个子树的根节点 root
构建该根节点的左子树
构建该根节点的右子树
注:前序遍历和中序遍历的右子树索引范围肯定是一样的。因为都是同一棵树,右子树的个数都一致。
时间复杂度:O(n)O(n)
空间复杂度:O(n)O(n)
代码实现:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if len(inorder) == 0:
return None
# 前序遍历第一个值为根节点
root = TreeNode(preorder[0])
# 因为没有重复元素,所以可以直接根据值来查找根节点在中序遍历中的位置 # 用preorder[0]去中序数组中查找对应的元素
mid = inorder.index(preorder[0])
# 构建左子树 # 递归的处理前序数组的左边部分和中序数组的左边部分
root.left = self.buildTree(preorder[1:mid+1], inorder[:mid])
# 构建右子树 # 递归处理前序数组右边部分和中序数组右边部分
root.right = self.buildTree(preorder[mid+1:], inorder[mid+1:])
return root