LC 105二叉树中等第 50 / 95 题

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

Construct Binary Tree from Preorder and Inorder Traversal

递归哈希表分治
本机进度仅保存在当前浏览器

题目描述

给定两个整数数组 preorder 和 inorder,其中 preorder 是二叉树的前序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点(假设无重复值)。

示例:preorder = [3, 9, 20, 15, 7],inorder = [9, 3, 15, 20, 7],构造出 [3, 9, 20, null, null, 15, 7]。

解题思路

  1. 前序的第一个元素是根;在中序里找到它,左侧是左子树、右侧是右子树,由此确定两段子数组规模。
  2. 递归构造:按左右子树的规模切分前序与中序数组,分别建树后接到根上。
  3. 为避免每次线性查找根的位置,用哈希表预存「值 -> 中序下标」;传区间下标代替切片,避免复制数组。
  4. 无重复值是哈希定位成立的前提;重复值时该问题无唯一解。

参考实现

查看参考实现Python · 建议先自行作答
def buildTree(preorder, inorder):
    # 值 -> 中序下标,O(1) 定位根
    idx = {v: i for i, v in enumerate(inorder)}

    def build(pre_l, pre_r, in_l, in_r):
        if pre_l > pre_r:
            return None
        root_val = preorder[pre_l]
        root = TreeNode(root_val)
        mid = idx[root_val]
        left_size = mid - in_l
        root.left = build(pre_l + 1, pre_l + left_size, in_l, mid - 1)
        root.right = build(pre_l + left_size + 1, pre_r, mid + 1, in_r)
        return root

    return build(0, len(preorder) - 1, 0, len(inorder) - 1)

复杂度与归属

时间复杂度O(n)
空间复杂度O(n)
所属分类二叉树
题源LeetCode 105

关联教程

返回题图鉴