返回

用通俗易懂的语言解析LeetCode 654:最大二叉树(中等)

后端

一、题目

给定一个不重复的整数数组 nums。最大二叉树可以用下面的算法从 nums 递归地构造:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 将 nums 分成两个子数组:左子数组包含从根节点到最大值左边的所有值,右子数组包含从根节点到最大值右边的所有值。
  3. 使用同样的算法递归地为左子数组和右子数组构造二叉树。
  4. 返回根节点。

要求:

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

二、算法

为了解决这个问题,我们需要了解最大二叉树的性质:

  • 最大二叉树的根节点是数组中的最大值。
  • 最大二叉树的左子树是最大二叉树的根节点的左边的所有值的最大二叉树。
  • 最大二叉树的右子树是最大二叉树的根节点的右边的所有值的最大二叉树。

基于这些性质,我们可以使用递归的算法来构建最大二叉树:

  1. 找到数组中的最大值并将其作为根节点。
  2. 将数组分成两个子数组:左子数组包含从根节点到最大值左边的所有值,右子数组包含从根节点到最大值右边的所有值。
  3. 使用同样的算法递归地为左子数组和右子数组构造二叉树。
  4. 返回根节点。

三、实现

def constructMaximumBinaryTree(nums):
  """
  :type nums: List[int]
  :rtype: TreeNode
  """
  if not nums:
    return None

  # 找到数组中的最大值
  max_value = max(nums)
  max_index = nums.index(max_value)

  # 创建根节点
  root = TreeNode(max_value)

  # 构造左子树
  left_nums = nums[:max_index]
  root.left = constructMaximumBinaryTree(left_nums)

  # 构造右子树
  right_nums = nums[max_index + 1:]
  root.right = constructMaximumBinaryTree(right_nums)

  return root

四、示例

nums = [3, 2, 1, 6, 0, 5]
root = constructMaximumBinaryTree(nums)
print(root)

输出:

      6
     / \
    3   5
   / \   \
  2   0   1

在给定的数组中,最大值是6,因此6成为根节点。左子数组是[3, 2, 1],右子数组是[0, 5]。我们继续对左右子数组应用相同的算法,直到所有元素都被处理完毕。最终,我们将得到一棵最大二叉树。