LeetCode 热题 HOT 100 第四十天 105. 从前序与中序遍历序列构造二叉树 中等题 用python3求解

题目地址

给定两个整数数组 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 保证为二叉树的中序遍历序列
LeetCode 热题 HOT 100 第四十天 105. 从前序与中序遍历序列构造二叉树 中等题 用python3求解_第1张图片
前序遍历的第一个元素为根节点,而在中序遍历中,该根节点所在位置的左侧为左子树,右侧为右子树。

构建二叉树的问题本质上就是:
找到各个子树的根节点 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

你可能感兴趣的:(LeetCode,leetcode,深度优先,算法,力扣,数据结构)