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

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

  • 题目-中等难度
  • 示例
  • 1. dfs

题目-中等难度

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

示例

示例 1:
105. 从前序与中序遍历序列构造二叉树_第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)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. dfs

时间
40ms
击败 90.24%使用 Python 的用户
内存
18.18MB
击败 68.15%使用 Python 的用户

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def buildTree(self, preorder, inorder):
        """
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        """
        # 创建字典存放inorder的索引,方便在之后查询根节点的位置
        dic = defaultdict(int)
        # 存放操作
        for i in range(len(inorder)):
            dic[inorder[i]] = i
        # 递归遍历
        def helper(preorder,preLeft,preRight,d,inLeft,inRight):
            # 超出判断条件,返回None
            if (preLeft > preRight or inLeft > inRight):
                return None
            # 根节点为每次遍历preorder的首位
            rootVal = preorder[preLeft]
            # 创建根节点
            root = TreeNode(rootVal)
            # 获取inorder中根节点的索引
            pIndex = d[rootVal]
            # 左节点, preorder 从 preLeft+1 开始到 pIndex - inLeft + preLeft位置
            # 计算原理是 x - preLeft = pIndex-inLeft => x = pIndex - inLeft + preLeft
            root.left = helper(preorder,preLeft+1,pIndex-inLeft+preLeft,d,inLeft,pIndex-1)
            # 右节点, preorder 从 pIndex-inLeft+preLeft+1 开始到 preRight
            # 计算原理是 pIndex - inLeft + preLeft 的下一个索引位置 所以是 pIndex - inLeft + preLeft + 1
            root.right = helper(preorder,pIndex-inLeft+preLeft+1,preRight,d,pIndex+1,inRight)
            return root
        # 初始preorder和inorder的左右索引都位于两端,preorder为list,跟踪索引, inorder为dict,快捷获取根节点索引
        return helper(preorder,0,len(preorder)-1,dic,0,len(inorder)-1)

你可能感兴趣的:(二叉树,算法,python,算法,leetcode,树)