654. 最大二叉树

https://leetcode-cn.com/problems/maximum-binary-tree/

解法一:递归

用一个辅助函数

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
        return self.helper(nums, 0, len(nums)-1)    #辅助函数
    
    def helper(self, nums, left, right):
        if left > right:    #递归出口
            return None
        i = nums.index(max(nums[left:right+1]))    #找最大值下标
        root = TreeNode(nums[i])
        root.left = self.helper(nums, left, i-1)
        root.right = self.helper(nums, i+1, right)
        return root

也可以不用辅助函数

解法二:c++

用map,一次遍历加map插入,复杂度O(n*logn),比较难理解. 关键在于map是有序的,每次插入后都会按key值重新排序,这样就理解为何要与begin,end比较.

另一个关键是为何处理完左子树后要把左边部分清除,因为是按从左到右的顺序读取nums的,因此当读取到nums[i]时,其左侧的元素都已确定并处理,若不清除的话,再读入nums[i]右侧的元素,插入map后就丢失元素位置信息了(map会重新排序,切记!),因此把左侧删掉后,map中剩下的就全是右侧元素了.

最后返回rbegin,即倒数第一个元素,map中key最大的值肯定是root,为何这样用呢?也很简单,因为end是不存储信息的,所以不能返回end

最后更新于