题目描述
给你一个整数数组 nums
,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。
示例 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,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 按 严格递增 顺序排列
代码及注释
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func sortedArrayToBST(nums []int) *TreeNode {
// 调用 build 函数构建 BST,并返回根节点
return build(nums, 0, len(nums) - 1)
}
func build(nums []int, l, r int) *TreeNode {
// 如果左指针大于右指针,说明已经没有元素可以添加,返回 nil
if l > r {
return nil
}
// 计算中间位置
mid := (l + r) / 2
// 创建根节点,并赋值为数组中间的元素
root := &TreeNode{Val: nums[mid]}
// 递归构建左子树
root.Left = build(nums, l, mid - 1)
// 递归构建右子树
root.Right = build(nums, mid + 1, r)
// 返回当前根节点
return root
}
代码解释
-
主函数
sortedArrayToBST
:主函数接收一个有序数组nums
,并调用build
函数以构建平衡二叉搜索树(BST)。l
和r
分别表示当前子数组的左右边界。 -
辅助函数
build
:- 基准情况:如果
l > r
,则当前子数组为空,返回nil
。 - 计算中间位置:取当前子数组的中间位置
mid
。 - 创建根节点:创建一个新的树节点
root
,其值为nums[mid]
。 - 递归构建左子树和右子树:使用递归分别构建左子树(
l
到mid-1
)和右子树(mid+1
到r
)。 - 返回根节点:返回当前构建的根节点
root
。
- 基准情况:如果