leetcode108:将有序数组转化为二叉搜索树
给你一个整数数组 nums
,其中元素已经按 升序 排列,请你将其转换为一棵
平衡
二叉搜索树。
示例 1:
输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3] 输出:[3,1] 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
按 严格递增 顺序排列
为了更好地解决这个问题并提供全面的解答,下面我将对任务进行逐步分析,详细解释每个步骤。我们将深入探讨如何将一个升序排列的整数数组转换为平衡二叉搜索树(Balanced Binary Search Tree, BST)。
问题概述
给定一个升序排列的整数数组 nums
,我们需要将其转换为一棵平衡二叉搜索树。平衡二叉搜索树是一棵满足以下条件的二叉树:
- 每个节点的左子树和右子树的高度差不超过1(即平衡)。
- 每个节点的左子树的值小于该节点的值,而右子树的值大于该节点的值。
步骤1:详细定义题目的计算问题性质
我们需要明确题目中的计算问题性质,并分析其中的输入输出条件和潜在的边界条件。
输入
nums
:一个整数数组,长度n
满足1 <= nums.length <= 10^4
。nums
中的元素按照严格升序排列,即nums[i] < nums[i+1]
。
输出
- 输出需要返回一棵平衡的二叉搜索树。
- 树中的节点值应保持与输入数组中的值一致,并且节点顺序必须符合二叉搜索树的性质。
边界条件
- 当数组长度为1时,输出的树应只有一个节点。
- 当数组长度为2时,输出的树可以有两个节点(左子树或右子树)。
- 数组的长度最大为10,000,意味着需要设计一个时间复杂度为O(n)的算法。
步骤2:分解题目并给出详细的解决思路
我们可以通过以下步骤来解决问题:
分析算法思路
这道题本质上要求我们在升序数组上构建一棵平衡的二叉搜索树。为了保持平衡,可以选择将数组的中间元素作为树的根节点。具体步骤如下:
-
递归构建树:从数组中选择中间元素作为根节点。然后递归地将左半部分数组(中间元素左侧)构建为左子树,右半部分数组(中间元素右侧)构建为右子树。
这意味着我们可以通过递归来分治问题,逐步构建出平衡二叉搜索树。
-
递归函数设计:我们可以定义一个递归函数,接受一个数组的子区间(由
left
和right
索引表示),每次选择中间元素作为根节点,并继续递归地构建左右子树。
算法设计
-
递归步骤:假设当前子数组为
nums[left...right]
,我们选择mid = (left + right) // 2
作为根节点。然后递归地对nums[left...mid-1]
和nums[mid+1...right]
进行相同的操作,直到区间为空。 -
时间复杂度:
- 每次递归时,我们从当前区间中选择一个中间元素作为根节点,划分成两个子区间。
- 由于每个元素仅被访问一次,整个树的构建过程的时间复杂度是
O(n)
,其中n
是数组的长度。
-
空间复杂度:
- 递归调用栈的最大深度为树的高度,即
O(log n)
,因此空间复杂度为O(log n)
。
- 递归调用栈的最大深度为树的高度,即
实现细节
- 在 C++ 中,我们需要构建一个树节点类
TreeNode
,该类包含值、左子树指针和右子树指针。
步骤3:C++代码实现
// 定义树节点结构
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 递归构建平衡二叉搜索树的函数
TreeNode* sortedArrayToBSTHelper(const vector<int>& nums, int left, int right) {if (left > right) {return nullptr;}// 选择中间元素作为根节点int mid = left + (right - left) / 2;TreeNode* root = new TreeNode(nums[mid]);// 递归构建左子树和右子树root->left = sortedArrayToBSTHelper(nums, left, mid - 1);root->right = sortedArrayToBSTHelper(nums, mid + 1, right);return root;
}// 主函数:将数组转换为平衡二叉搜索树
TreeNode* sortedArrayToBST(const vector<int>& nums) {return sortedArrayToBSTHelper(nums, 0, nums.size() - 1);
}// 中序遍历函数,用于输出树的结构
void inorderTraversal(TreeNode* root) {if (root == nullptr) return;inorderTraversal(root->left);cout << root->val << " ";inorderTraversal(root->right);
}
代码解析
- TreeNode结构体:用于表示二叉树的节点,包括一个整数值
val
和指向左右子节点的指针。 - sortedArrayToBSTHelper函数:递归构建树的核心函数。每次选择中间元素创建树节点,并递归地构建左、右子树。
- sortedArrayToBST函数:这是入口函数,调用
sortedArrayToBSTHelper
来构建整个树。 - inorderTraversal函数:中序遍历函数,用于验证树的结构是否正确(因为平衡二叉搜索树的中序遍历应该是升序排列的)。
步骤4:从解题中总结启发
通过解决这个问题,我们可以总结出以下启发:
- 分治策略:该问题可以通过分治法来解决。每次选择数组的中间元素作为根节点,这是一种典型的递归问题,通过递归地分解问题来构建树。
- 平衡树的构建:通过确保每次选择中间元素,我们能够保证树的平衡性,使得左右子树的高度差最小,从而避免树的退化。
- 递归优化:递归是解决此类树问题的常见手段,关键在于如何合理划分问题的规模,并将问题简化到基本情况。
步骤5:探讨该算法的实际应用场景
平衡二叉搜索树(如 AVL 树、红黑树)在多个行业中有广泛的应用,特别是在需要高效查找、插入和删除操作的场景中。以下是几个实际应用示例:
- 数据库索引:数据库系统经常使用平衡二叉搜索树来实现索引,这样可以在O(log n)的时间复杂度内查找数据。
- 操作系统调度:在操作系统中,平衡二叉搜索树可以用于管理进程队列,以实现优先级调度。
- 网络路由:在计算机网络中,路由器可以使用平衡树来存储路由表,并实现快速的路由查找。
通过合理设计和应用平衡二叉搜索树,可以在许多需要快速查找、插入和删除操作的应用中大大提高性能。
相关文章:

leetcode108:将有序数组转化为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…...
截图技术方案
安卓截屏技术附带悬浮窗自动存储功能_安卓截图浮窗-CSDN博客 https://chat.baidu.com/search?dyTabStrMCwxMiwzLDEsMiwxMyw3LDYsNSw5&pdcsaitab&setypecsaitab&extParamsJson%7B%22apagelid%22%3A%2210990774271994514433%22%2C%22enter_type%22%3A%22a_ai_index%…...

程序员测试日常小工具
作为一名程序员,或者测试人员,日常工作最常用的工具有哪些,截图,截图漂浮,翻译,日期处理,api调用..., 当你拿到一串报文后,想要json转换时,是不是要打…...
Kubernetes: NetworkPolicy 的实践应用
一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范,用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...

HTML5滑块(Slider)
HTML5 的滑块(Slider)控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例: <…...
数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)
编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...
洪水灾害多智能体分布式模拟示例代码
1. 环境定义:支持灾害动态、地理数据和分布式架构 import numpy as np import random import matplotlib.pyplot as plt# 新疆主要城市及邻接关系 XINJIANG_CITIES {Urumqi: [Changji, Shihezi],Changji: [Urumqi, Shihezi, Turpan],Shihezi: [Urumqi, Changji, K…...
【前端】Node.js使用教程
目录 一、?Node.js开发环境和编译 1.1 安装Node.js 1.2 创建一个Node.js项目 1.3 编写Node.js程序 1.4 运行Node.js程序 1.5 使用Node.js模块 二、高级的Node.js编程概念和示例 2.1 异步编程 2.2 错误处理 2.3 网络请求 2.4 构建Web服务器 2.5 数据库交互 三、No…...

django33全栈班2025年004 录入数据
前言 通过前面的学习, 我们已经算是Python基本入门了. 如果你能熟练的掌握的话, 至少让你换台电脑, 在新电脑上搭建Python的开发环境肯定是没问题的. 我们呢也学习了第一行Python代码, 但是我们不知道这行代码是什么意思, 为什么能够运行, 怎么就能输出到控制台呢? 还有, …...

小白投资理财 - 看懂 EPS 每股收益
小白投资理财 - 看懂 EPS 每股收益 什么是 EPSEPS 缺陷EPS 优点EPS 跟自己比EPS 跟别人比 总结 投资一家公司就要选择会赚钱的公司,我们最为关心的莫过于公司的盈利能力,只有会下蛋的鸡才是好鸡,买股票为的就是获得利润。想成为一位成功的投资…...

Pandas-apply自定义函数
文章目录 一. Series的apply方法1. 一个元素一个元素的传入2. apply传入一个参数函数2.apply传入多个参数函数 二. DataFrame的apply方法1. axis参数指定按行/ 按列(默认)传入数据2. apply使用 三. apply 使用案例1. 栗子12. 栗子2-列3. 栗子3-行 四. 向量化函数1. 使用np.vect…...

github 项目分享
今天和大家分享一些github上面搜到关于卫星遥感和水环境相关的项目。 一、WaterDetect 使用端到端算法去识别水体范围的算法,针对哨兵2卫星遥感数据可用。 项目地址: https://github.com/cordmaur/WaterDetect 二、DeepWaterMap 深度卷积神经网络去…...
与你共度的烟火日常
见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... 我和她一起收拾完屋子,忙完已经中午了。她说:“咱们去趟超市吧&…...

基于Python的社交音乐分享平台
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Kafka的acks机制和ISR列表
Kafka 是一个流行的分布式流处理平台,用于构建实时数据流管道和应用程序。在 Kafka 中,acks 机制和 ISR(In-Sync Replicas)列表是两个重要的概念,它们共同确保消息的持久性和可靠性。 acks 机制 acks 机制是 Kafka 生…...
FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)
在讨论 ISR(中断服务例程)和 TCB(任务控制块,Task Control Block)时,我们实际上是在探讨 FreeRTOS 中两个不同但又相互关联的概念:一个是用于处理硬件或软件触发的中断事件,另一个是…...
【Spring】Spring DI(依赖注入)详解—自动装配—byType实现原理
一、引言 依赖注入(Dependency Injection, DI)是Spring框架的核心特性之一,它通过控制反转(Inversion of Control, IoC)来管理对象的生命周期和依赖关系。在实际应用中,DI不仅提高了代码的可维护性和可测试…...

015-spring-动态原理、AOP的xml和注解方式
强制使用cglib动态代理 spring-AOP的使用...
linux更换yum源
1.备份系统源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2.下载国内的yum源到/etc/yum.repos.d/CentOS-Base.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo如无法使用wget命令也可以…...

跨年战揭开本地生活新赛季:美团、抖音和快手争夺冰雪经济
元旦将至,冬季文旅消费渐至高潮。 2024年的文旅消费市场延续了去年冰雪游的热度,不断创下年内话题和热度新高。美团旅行数据显示,12月以来,雪场夜滑搜索热度同比增长65%,TOP5搜索城市分别是北京、乌鲁木齐、张家口、吉…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...