创见博客
将有序数组转换为二叉搜索树
七崽爱吃小饼干2026/01/15阅读 0专栏 算法合集

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 按 严格递增 顺序排列

解法

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 {
    const buildTree = (start: number, end: number): TreeNode | null => {
        // 递归终止:区间无效,无节点
        if (start > end) return null;
        // 1. 取区间中点,作为当前根节点
        const mid = Math.floor((start + end) / 2);
        // 2. 创建当前根节点
        const root = new TreeNode(nums[mid]);
        // 3. 递归构建左子树:左半区间
        root.left = buildTree(start, mid - 1);
        // 4. 递归构建右子树:右半区间
        root.right = buildTree(mid + 1, end);
        // 返回当前根节点
        return root;
    }
    // 初始调用:整个数组区间 [0, len-1]
    return buildTree(0, nums.length - 1);
};
评论
0/100