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

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 级别。

    http://www.xdnf.cn/news/1159.html

    相关文章:

  1. Python——入门... ...
  2. 突破 RAG 检索瓶颈:Trae+MCP 构建高精度知识库检索系统实践
  3. 嘻游组件解密工具实战教程:资源解包与UI替换全流程
  4. 一目十行阅读法
  5. 航电系统自适应与容错机制要点
  6. Git ——提交至github,Vercel拉取,更新不了项目的问题解决
  7. LOH 怎么进行深度标准化?
  8. (15)VTK C++开发示例 --- 生成随机数的首选方法
  9. 【读论文】HM-RAG:分层多智能体多模态检索增强生成
  10. Spring Boot多环境配置详解
  11. 通俗的理解TCP的三次握手四次挥手
  12. Mysql的redolog
  13. 【inlining failed in call to always_inline ‘_mm_aesenclast_si128’】
  14. Python线程全面详解:从基础概念到高级应用
  15. C++ 的 输入输出流(I/O Streams)
  16. 课时一 平面机构的自由度与速度分析(上)
  17. 学车经验2 倒库+欧卡2开车经验
  18. Pandas基础学习分析处理nginx日志
  19. MySql进阶
  20. 【YOLOv8改进 - C2f融合】C2f融合SHViTBlock:保证计算效率的同时,能够有效地捕捉图像的局部和全局特征
  21. 1.3 本书结构概览:从理论基础到实践案例的系统阐述
  22. 4.22排序链表(几种排序算法比较)
  23. 其它生成式(对比列表生成式)
  24. 区间分组详解
  25. 【C++】智能指针原理以及详细讲解shared_ptr精简版实现
  26. 一个 HTTP 请求进入 Spring MVC 应用后,大致经历了哪些主要步骤?
  27. 【C++】——入门基础(一)
  28. 关于el-table可展开行实现懒加载的方案
  29. 网易云IP属地可以查看城市吗?深度解析与使用指南
  30. [创业之路-380]:企业法务 - 企业经营中,企业为什么会虚开増值税发票?哪些是虚开増值税发票的行为?示例?风险?