要求
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入: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
解题思想:题眼的点:1、高度平衡 2、二叉搜索树;因为给到我们的是一个升序排列好的数组,所以我们每次都是取中间的值来做根节点,这样可以保证左右子树的高度基本统一,就是高度平衡;小于中间值的做左子树,大于中间值的做右子树,构建的是二叉搜索树,所以核心思路,取中间值,递归构建树。