108. 将有序数组转换为二叉搜索树
题目链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/
代码
ts
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function sortedArrayToBST(nums: number[]): TreeNode | null {
function dfs(left: number, right: number) {
if (left === right) {
return null;
}
const mid = Math.floor((left + right) / 2);
return new TreeNode(nums[mid], dfs(left, mid), dfs(mid + 1, right));
}
return dfs(0, nums.length)
};思路
将有序数组转换为高度平衡的二叉搜索树,关键是选择中间元素作为根节点:
- 使用递归 DFS 构建二叉树
- 递归函数参数:
left:当前子数组的左边界(包含)right:当前子数组的右边界(不包含)
- 递归过程:
- 如果
left === right,说明区间为空,返回 null - 计算中间位置
mid = Math.floor((left + right) / 2) - 以
nums[mid]为根节点 - 递归构建左子树:
dfs(left, mid) - 递归构建右子树:
dfs(mid + 1, right)
- 如果
关键点
选择中间元素作为根节点,保证左右子树高度差不超过 1
使用左闭右开区间
[left, right)简化边界处理递归终止条件:
left === right表示空区间时间复杂度
,其中 是数组长度,每个元素访问一次 空间复杂度
,递归调用栈的深度