这题目是有一个常见的套路的,由于先序遍历的结果list都会遵循这样的一个排列方式,也就是第一个是root,后面的分别是左子树的node的集合,以及右子树的node的集合。
[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
而inorder中序遍历的结果则是:
[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
画成下图就可以表示为:
我们通过preorder拿到root的地址之后,就可以找到root在inorder当中的位置。然后拿到preorder和inorder当中的左子树和右子树,这样就可以对root.left以及root.right进行递归,build出一棵完整的二叉树。
代码如下:
# Definition for a binary tree node. # 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 or not inorder: # 递归终止条件,用这个终止条件是因为如果为空,则后面的递归(用分治法的时候)无法进行对list的切片 return root = TreeNode(preorder[0]) idx = inorder.index(preorder[0]) root.left = self.buildTree(preorder[1:1 + idx], inorder[:idx]) root.right = self.buildTree(preorder[1 + idx:], inorder[idx + 1:]) return root