给定一棵树的前序遍历 preorder
与中序遍历 inorder
。请构造二叉树并返回其根节点。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1] Output: [-1]
提示:
- 1 <= preorder.length <= 3000
- inorder.length == preorder.length
- -3000 <= preorder[i], inorder[i] <= 3000
- preorder 和 inorder 均无重复元素
- inorder 均出现在 preorder
- preorder 保证为二叉树的前序遍历序列
- inorder 保证为二叉树的中序遍历序列
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
n = len(preorder)
m = len(inorder)
if m != n:
return None
mapper = {}
for index,num in enumerate(inorder):
mapper[num] = index#中序遍历的索引
return self.build(preorder,0,n-1,mapper,0,m-1)
def build(self,preorder,preLeft,preRight,mapper,inLeft,inRight):
if preLeft>preRight or inLeft>inRight:
return None
root_val = preorder[preLeft]#前序遍历的根
root = TreeNode(root_val,None,None)
index = mapper.get(root.val)
root.left = self.build(preorder,preLeft+1,index-inLeft+preLeft,mapper,inLeft,index-1)
root.right = self.build(preorder,index-inLeft+preLeft+1,preRight,mapper,index+1,inRight)
return root