要求
给定一棵树的前序遍历 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]
核心代码
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
if not preorder:
return None
root = TreeNode(preorder[0])
left_inorder = inorder[:inorder.index(root.val)]
right_inorder = inorder[inorder.index(root.val)+1:]
l_left = len(left_inorder)
left_preorder = preorder[1:l_left + 1]
right_preorder = preorder[l_left + 1:]
root.left = self.buildTree(left_preorder,left_inorder)
root.right = self.buildTree(right_preorder,right_inorder)
return root
重点题目
解题思路
树的构建过程我们几乎都是使用递归的方式,所以我们需要找到递归的点,在前序遍历中,我们可以知道preorder[0]就是root,我们可以从中序遍历中知道,在root元素左端的是左子树,右端的是右子树,这样我们可以知道左子树的长度,在前序序列中划分出左子树序列和右子树序列,这样就能得到构建左子树和右子树的递归方式。