📜  从两个给定的二叉树构造一个最大二叉树(1)

📅  最后修改于: 2023-12-03 15:21:55.360000             🧑  作者: Mango

从两个给定的二叉树构造一个最大二叉树

问题描述

给定两个二叉树,将它们合并成一个最大的二叉树。

最大二叉树定义如下:

二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构造最大二叉树并返回其根节点。

示例
示例1:

输入:

Array1 = [3, 2, 1, 6, 0, 5] Array2 = [4, 7, 0, 1, 5, 8]

输出:

       8
      /
     7
    / \
   6   5
  /   / \
 3   2   4
       /
      0
     / 
    1
思路

对于每一个数组,找出最大值及其下标;然后将该最大值左右两边的数组分别作为新数组,递归调用构造函数。

由于根据数组构造二叉树是一个很常见的问题,我们可以先写一个函数根据数组获取二叉树,然后再根据两个数组构造最大二叉树。

代码实现

class TreeNode(object):
  def __init__(self, val=0, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right

def constructMaximumBinaryTree(nums):
  if not nums:
      return None
  maxIndex = 0
  for i in range(1, len(nums)):
      if nums[i] > nums[maxIndex]:
          maxIndex = i
  root = TreeNode(nums[maxIndex])
  root.left = constructMaximumBinaryTree(nums[:maxIndex])
  root.right = constructMaximumBinaryTree(nums[maxIndex + 1:])
  return root

def mergeTrees(t1, t2):
  if not t1:
      return t2
  if not t2:
      return t1
  if t1.val > t2.val:
      t1.left = mergeTrees(t1.left, t2)
      return t1
  else:
      t2.left = mergeTrees(t2.left, t1)
      return t2

def constructMaximumBinaryTree1(nums1, nums2):
  tree1 = constructMaximumBinaryTree(nums1)
  tree2 = constructMaximumBinaryTree(nums2)
  return mergeTrees(tree1, tree2)

复杂度分析

时间复杂度:

由于根据数组构建二叉树的时间复杂度是 O(n),每次递归调用最大值左右两边的数组,所以时间复杂度为 O(nlogn)。

空间复杂度:

递归栈的最大深度为 logn,所以空间复杂度为 O(logn)。