中点为根——力扣108.讲有序数组转换为二叉搜索树

力扣108.讲有序数组转换为二叉搜索树


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

难度:简单 | 题型:二叉树、分治、递归


一、题目理解

题目要求我们将一个升序数组 转换成一棵高度平衡的二叉搜索树(BST)。

平衡BST的定义:任意节点的左右子树高度差不超过1。

二叉搜索树(BST)的性质:

  • 左子树所有节点的值 < 根节点的值;
  • 右子树所有节点的值 > 根节点的值。

二、核心思路

数组是升序排列的,因此:

  • 若我们直接取中间元素作为根节点,
  • 左半部分作为左子树,
  • 右半部分作为右子树,
    就能保证BST的有序性 与平衡性。

这就是典型的 分治思想(Divide and Conquer)。


三、思路图示

以 nums = [-10, -3, 0, 5, 9] 为例:

复制代码
nums = [-10, -3, 0, 5, 9]

 中点为 0 → 根节点 = 0
 左区间 [-10, -3] → 构建左子树
 右区间 [5, 9] → 构建右子树

       0
     /   \
   -3     9
   /     /
-10     5

这棵树既符合 BST 定义,又是平衡的。


四、代码实现(递归版 推荐写法)

java 复制代码
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return build(nums, 0, nums.length - 1);
    }

    private TreeNode build(int[] nums, int left, int right) {
        // 递归终止条件:区间为空
        if (left > right) return null;

        // 取中间点,防止溢出
        int mid = left + (right - left) / 2;

        // 构建当前节点
        TreeNode root = new TreeNode(nums[mid]);

        // 递归构建左右子树
        root.left = build(nums, left, mid - 1);
        root.right = build(nums, mid + 1, right);

        return root;
    }
}

五、方法二:迭代法(队列模拟递归)

虽然递归写法最简洁,但也可以通过队列模拟建树过程。

思路:

  • 使用一个队列存储节点和对应区间 [left, right]。
  • 取中点创建节点;
  • 将左右区间加入队列;
  • 持续构造直到区间耗尽。

此法更复杂但能避免递归栈溢出,适合面试时展示"多角度思维"。


六、复杂度分析

项目 递归法 迭代法
时间复杂度 O(n) O(n)
空间复杂度 O(log n)(递归栈) O(n)(队列)
平衡性 ✅ 自动平衡 ✅ 自动平衡

七、总结

特性 说明
数据有序 可以直接利用中点特性构造BST
保证平衡 中点划分天然平衡
递归思路 最清晰、最常用
关键点 mid = left + (right - left) / 2 防止溢出

相关推荐
闻缺陷则喜何志丹1 小时前
【C++特性】四种类型转
c++·算法·类型转换
喵本喵叁肆1 小时前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
青梅味猪大肠2 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
CoderYanger2 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
其实防守也摸鱼17 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt17 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one20 小时前
递归算法(一)
java·开发语言·算法
圣保罗的大教堂20 小时前
leetcode 3736. 最小操作次数使数组元素相等 III 简单
leetcode
文丑颜不良啊21 小时前
LeetCode1881~1990题目解析
java·leetcode