leetcode_108 将有序数组转换为二叉搜索树

275 阅读1分钟

要求

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

image.png

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

image.png

示例 2:

image.png

输入:nums = [1,3]
输出:[3,1]
解释:[1,3][3,1] 都是高度平衡二叉搜索树。

核心代码

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if not nums:
            return None
        def dfs(start,end):
            if end < start:
                return 
            mid = (end + start) // 2
            root = TreeNode(nums[mid])

            root.left = dfs(start,mid-1)
            root.right = dfs(mid+1,end)
            return root
        return dfs(0,len(nums) - 1)

另一解法(改进)

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if not nums:
            return None
        l = len(nums)
        root = TreeNode(nums[l//2])
        root.left = self.sortedArrayToBST(nums[:l//2])
        root.right = self.sortedArrayToBST(nums[l//2+1:])
        return root

image.png

解题思想:题眼的点:1、高度平衡 2、二叉搜索树;因为给到我们的是一个升序排列好的数组,所以我们每次都是取中间的值来做根节点,这样可以保证左右子树的高度基本统一,就是高度平衡;小于中间值的做左子树,大于中间值的做右子树,构建的是二叉搜索树,所以核心思路,取中间值,递归构建树。