📅  最后修改于: 2023-12-03 15:21:55.360000             🧑  作者: Mango
给定两个二叉树,将它们合并成一个最大的二叉树。
最大二叉树定义如下:
二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构造最大二叉树并返回其根节点。
输入:
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)。