中点为根——力扣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 防止溢出

相关推荐
naruto_lnq2 分钟前
泛型编程与STL设计思想
开发语言·c++·算法
踩坑记录17 分钟前
leetcode hot100 94. 二叉树的中序遍历 easy 递归 dfs
leetcode
zxsz_com_cn22 分钟前
设备预测性维护算法分类及优劣势分析,选型指南来了
算法·分类·数据挖掘
Angelina_Jolie1 小时前
一文搞懂 SCI、SSCI、CSSCI、C 刊、核心期刊:定义、作用、层级对比及投稿选择
考研·职场和发展·创业创新
m0_748708051 小时前
C++中的观察者模式实战
开发语言·c++·算法
然哥依旧1 小时前
【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)
算法·支持向量机·matlab·cnn
qq_537562671 小时前
跨语言调用C++接口
开发语言·c++·算法
Tingjct1 小时前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
C雨后彩虹1 小时前
计算疫情扩散时间
java·数据结构·算法·华为·面试
yyy(十一月限定版)2 小时前
寒假集训4——二分排序
算法