当前位置: 首页 > news >正文

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

目录

一、问题描述

二、解题思路

三、代码

四、复杂度分析


一、问题描述

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

二、解题思路

✅ 题目关键点

  1. 升序数组 → 所以中间的元素最适合做根节点。

  2. 平衡 BST → 任意一个节点的左右子树高度差不超过 1。


🧠 解题思路

我们使用 递归 + 分治 的方式:

  1. 找到当前数组的“中间元素”,作为根节点。

  2. 左半部分递归构建左子树,右半部分递归构建右子树。

  3. 返回根节点。


✅ 图示说明

假设数组是 [ -10, -3, 0, 5, 9 ]

  • 中间是 0 → 设为根节点

  • 左边 [ -10, -3 ] → 构建左子树

  • 右边 [ 5, 9 ] → 构建右子树

构建完就得到一棵平衡的 BST。

    三、代码

    /*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {
    public:TreeNode* sortedArrayToBST(vector<int>& nums) {return buildBST(nums, 0, nums.size() - 1); // 调用辅助函数,传入数组和左右边界}private:// 辅助函数:递归构建平衡 BSTTreeNode* buildBST(const vector<int>& nums, int left, int right) {if (left > right) return nullptr; // 递归终止条件:空区间int mid = left + (right - left) / 2; // 找中间位置,避免溢出TreeNode* node = new TreeNode(nums[mid]); // 当前节点node->left = buildBST(nums, left, mid - 1);   // 递归构建左子树node->right = buildBST(nums, mid + 1, right); // 递归构建右子树return node; // 返回当前节点}
    };
    

    四、复杂度分析

    • 时间复杂度:O(n)
      每个元素都恰好被访问一次。

    • 空间复杂度:O(log n)(递归栈空间)
      取决于树的高度,平衡 BST 的高度是 log 级别。

    相关文章:

  1. 诠视科技MR眼镜如何使用头瞄点和UGUI交互
  2. Unity-GC详解
  3. 机器学习逻辑回归损失函数与正则化技术深度解析
  4. 网络协议之详解(Detailed Explanation of Network Protocol)
  5. 第33周JavaSpringCloud微服务 面试题
  6. 【数据可视化-21】水质安全数据可视化:探索化学物质与水质安全的关联
  7. Qt开发:软件崩溃时,如何生成dump文件
  8. ffmpeg 硬解码相关知识
  9. Spring之我见 - Spring MVC重要组件和基本流程
  10. 开启报名!火山引擎 x PICO-全国大学生物联网设计竞赛赛题发布
  11. 【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)
  12. 【随手记】jupyter notebook绘制交互式图像
  13. Shell循环语句---for和while
  14. 【上海大学数据库原理实验报告】MySQL数据库的C/S模式部署
  15. 发送百度地图的定位
  16. 物联网蓬勃发展是助力楼宇自控技术迈向成熟的关键
  17. AI 健康小屋:开启智慧健康管理新范式
  18. # 06_Elastic Stack 从入门到实践(六)
  19. ffmpeg av_buffer_unref的逻辑实现; av_freep 和 av_freep函数的区别
  20. 用c语言实现——一个带头节点的链队列,支持用户输入交互界面、初始化、入队、出队、查找、判空判满、显示队列、遍历计算长度等功能
  21. 正荣地产旗下“H20正荣2”债未能于宽限期内支付分期偿付款,尚未就新兑付方案达成一致
  22. 外贸50城,谁在“扛大旗”?
  23. IMF将今年美国经济增长预期下调0.9个百分点至1.8%
  24. 受贿超8.22亿,新疆维吾尔自治区党委原副书记李鹏新一审被判死缓
  25. 受贿超8.22亿元,新疆维吾尔自治区党委原副书记李鹏新一审被判死缓
  26. 中国政府援缅第八批紧急人道主义地震救灾物资抵达缅甸