leetcode_105 从前序与中序遍历序列构造二叉树

76 阅读1分钟

要求

给定一棵树的前序遍历 preorder 与中序遍历  inorder。请构造二叉树并返回其根节点。

示例 1:

image.png

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

image.png

重点题目

解题思路

树的构建过程我们几乎都是使用递归的方式,所以我们需要找到递归的点,在前序遍历中,我们可以知道preorder[0]就是root,我们可以从中序遍历中知道,在root元素左端的是左子树,右端的是右子树,这样我们可以知道左子树的长度,在前序序列中划分出左子树序列和右子树序列,这样就能得到构建左子树和右子树的递归方式。