题目-中等难度
给定两个整数数组 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)
链接: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)