前序确定根节点值,带入中序,找到中序中根节点位置。
根据根节点位置将前序和中序都分为左右子序列,化成原问题两个子问题,然后递归求解。
class Solution:
    def reConstructBinaryTree(self , pre: List[int], vin: List[int]) -> TreeNode:
        # 终止条件,之后没有节点了
        if not vin:
            return None
        idx = vin.index(pre[0])
        lvin= vin[:idx]                 # 左子树中序,越界返回空
        rvin = vin[idx+1:]              # 右子树中序,越界返回空
        lpre = pre[1:idx+1]             # 左子树前序,越界返回空
        rpre = pre[idx+1:]              # 右子树前序,越界返回空
        print(lvin, rvin, lpre, rpre)
        # 递归建树
        head = TreeNode(pre[0])
        left = self.reConstructBinaryTree(lpre, lvin)
        head.left = left
        right = self.reConstructBinaryTree(rpre, rvin)
        head.right = right
        return head