赞
踩
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
示例 1:
输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
示例 2:
输入:nums = [3,2,1]
输出:[3,null,2,null,1]
提示:
1 <= nums.length <= 1000
0 <= nums[i] <= 1000
nums 中的所有整数 互不相同
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
def construct(left: int, right: int) -> Optional[TreeNode]:
if left>right: return None
best = left
for i in range(left + 1, right + 1):
if nums[i] > nums[best]: best = i
root = TreeNode(nums[best])
root.left = construct(left, best - 1)
root.right = construct(best + 1, right)
return root
return construct(0, len(nums)-1)
时间复杂度:O(n2)
空间复杂度:O(n)
需要参考LeetCode-496. 下一个更大元素 I【栈 数组 哈希表 单调栈】和LeetCode-503. 下一个更大元素 II【栈 数组 单调栈】
关于更多的解释参考官方题解吧。最大二叉树
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
n = len(nums)
stk = []
left, right = [-1] * n, [-1] * n
tree = [None] * n
# 维护左右侧大值
for i in range(n):
tree[i] = TreeNode(nums[i])
while stk and nums[i] > nums[stk[-1]]:
# 右侧大值在出栈时维护
right[stk[-1]] = i
stk.pop()
if stk:
# 左侧大值在出栈后维护
left[i] = stk[-1]
stk.append(i)
root = None
for i in range(n):
# 如果左右都没有大值,说明是根节点
if left[i] == right[i] == -1:
root = tree[i]
# 如果右侧没有大值,或者左侧大值小于右侧大值,那么该节点是左侧大值的右孩子
elif right[i] == -1 or (left[i] != -1 and nums[left[i]] < nums[right[i]]):
tree[left[i]].right = tree[i]
# 如果右侧的元素较小,那么该元素就是右侧元素的左子节点。
else:
tree[right[i]].left = tree[i]
return root
时间复杂度:O(n)
空间复杂度:O(n)
我们还可以把最后构造树的过程放进单调栈求解的步骤中,省去用来存储左右边界的数组。下面的代码理解起来较为困难,同一个节点的左右子树会被多次赋值,读者可以仔细品味其妙处所在。
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
n = len(nums)
stk = list()
tree = [None] * n
for i in range(n):
tree[i] = TreeNode(nums[i])
while stk and nums[i] > nums[stk[-1]]:
tree[i].left = tree[stk[-1]]
stk.pop()
if stk:
tree[stk[-1]].right = tree[i]
stk.append(i)
return tree[stk[0]]
细细品味
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。