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

相关推荐
haoly19893 小时前
数据结构和算法篇-归并排序的两个视角-迭代和递归
数据结构·算法·归并排序
im_AMBER4 小时前
算法笔记 05
笔记·算法·哈希算法
夏鹏今天学习了吗4 小时前
【LeetCode热题100(46/100)】从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
吃着火锅x唱着歌4 小时前
LeetCode 2389.和有限的最长子序列
算法·leetcode·职场和发展
嶔某5 小时前
二叉树的前中后序遍历(迭代)
算法
007php0075 小时前
百度面试题解析:微服务架构、Dubbo、Redis及其一致性问题(一)
redis·百度·docker·微服务·容器·职场和发展·架构
WWZZ20255 小时前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam
孤狼灬笑5 小时前
深度学习经典分类(算法分析与案例)
rnn·深度学习·算法·cnn·生成模型·fnn
dragoooon345 小时前
[优选算法专题四.前缀和——NO.26二维前缀和]
算法