将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
解题思路
题目要求将一个有序数组转换为高度平衡的二叉搜索树(Binary Search Tree,简称BST)。在BST中,左子树的所有节点值都小于根节点值,右子树的所有节点值都大于根节点值。为了使得树高度平衡,根节点的选择非常关键,通常选择数组的中间元素作为根节点,这样左右子树的节点数量差不多相等,从而保证树的高度平衡。
完整代码如下:
class Solution:
def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
if left > right:
return None
mid = left + (right - left) // 2
root = TreeNode(nums[mid])
root.left = self.traversal(nums, left, mid - 1)
root.right = self.traversal(nums, mid + 1, right)
return root
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
root = self.traversal(nums, 0, len(nums) - 1)
return root
def traversal(self, nums: List[int], left: int, right: int) -> TreeNode:
if left > right:
return None
mid = left + (right - left) // 2
root = TreeNode(nums[mid])
root.left = self.traversal(nums, left, mid - 1)
root.right = self.traversal(nums, mid + 1, right)
return root
traversal
函数是递归地构建二叉搜索树的核心部分。它通过分治法将数组分成左右两部分,递归地构建树的左右子树。
-
输入参数:
nums
: 输入的有序数组。left
: 当前子数组的左边界索引。right
: 当前子数组的右边界索引。
-
处理逻辑:
- 递归终止条件: 当
left > right
时,说明当前子数组为空,无法再继续分割,此时返回None
,表示当前节点不存在。 - 选择中间元素作为根节点: 计算中间索引
mid = left + (right - left) // 2
,然后用这个索引对应的元素nums[mid]
创建当前子树的根节点root
。 - 递归构建左右子树:
- 左子树由数组左半部分构成,递归调用
self.traversal(nums, left, mid - 1)
。 - 右子树由数组右半部分构成,递归调用
self.traversal(nums, mid + 1, right)
。
- 左子树由数组左半部分构成,递归调用
- 返回根节点: 最后返回当前构建的根节点
root
。
- 递归终止条件: 当
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
root = self.traversal(nums, 0, len(nums) - 1)
return root
这个函数是整个程序的入口函数。它接受一个有序数组nums
作为输入,并调用traversal
函数将该数组转换为一个高度平衡的二叉搜索树,最终返回生成的树的根节点。
nums
: 输入的有序数组。root
: 由traversal
函数生成的二叉搜索树的根节点。