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

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(即平衡)。
  2. 每个节点的左子树的值小于该节点的值,而右子树的值大于该节点的值。

步骤1:详细定义题目的计算问题性质

我们需要明确题目中的计算问题性质,并分析其中的输入输出条件和潜在的边界条件。

输入
  • nums:一个整数数组,长度 n 满足 1 <= nums.length <= 10^4
  • nums 中的元素按照严格升序排列,即 nums[i] < nums[i+1]
输出
  • 输出需要返回一棵平衡的二叉搜索树。
  • 树中的节点值应保持与输入数组中的值一致,并且节点顺序必须符合二叉搜索树的性质。
边界条件
  • 当数组长度为1时,输出的树应只有一个节点。
  • 当数组长度为2时,输出的树可以有两个节点(左子树或右子树)。
  • 数组的长度最大为10,000,意味着需要设计一个时间复杂度为O(n)的算法。

步骤2:分解题目并给出详细的解决思路

我们可以通过以下步骤来解决问题:

分析算法思路

这道题本质上要求我们在升序数组上构建一棵平衡的二叉搜索树。为了保持平衡,可以选择将数组的中间元素作为树的根节点。具体步骤如下:

  1. 递归构建树:从数组中选择中间元素作为根节点。然后递归地将左半部分数组(中间元素左侧)构建为左子树,右半部分数组(中间元素右侧)构建为右子树。

    这意味着我们可以通过递归来分治问题,逐步构建出平衡二叉搜索树。

  2. 递归函数设计:我们可以定义一个递归函数,接受一个数组的子区间(由 leftright 索引表示),每次选择中间元素作为根节点,并继续递归地构建左右子树。

算法设计
  1. 递归步骤:假设当前子数组为 nums[left...right],我们选择 mid = (left + right) // 2 作为根节点。然后递归地对 nums[left...mid-1]nums[mid+1...right] 进行相同的操作,直到区间为空。

  2. 时间复杂度

    • 每次递归时,我们从当前区间中选择一个中间元素作为根节点,划分成两个子区间。
    • 由于每个元素仅被访问一次,整个树的构建过程的时间复杂度是 O(n),其中 n 是数组的长度。
  3. 空间复杂度

    • 递归调用栈的最大深度为树的高度,即 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);
}
代码解析
  1. TreeNode结构体:用于表示二叉树的节点,包括一个整数值 val 和指向左右子节点的指针。
  2. sortedArrayToBSTHelper函数:递归构建树的核心函数。每次选择中间元素创建树节点,并递归地构建左、右子树。
  3. sortedArrayToBST函数:这是入口函数,调用 sortedArrayToBSTHelper 来构建整个树。
  4. inorderTraversal函数:中序遍历函数,用于验证树的结构是否正确(因为平衡二叉搜索树的中序遍历应该是升序排列的)。

步骤4:从解题中总结启发

通过解决这个问题,我们可以总结出以下启发:

  1. 分治策略:该问题可以通过分治法来解决。每次选择数组的中间元素作为根节点,这是一种典型的递归问题,通过递归地分解问题来构建树。
  2. 平衡树的构建:通过确保每次选择中间元素,我们能够保证树的平衡性,使得左右子树的高度差最小,从而避免树的退化。
  3. 递归优化:递归是解决此类树问题的常见手段,关键在于如何合理划分问题的规模,并将问题简化到基本情况。

步骤5:探讨该算法的实际应用场景

平衡二叉搜索树(如 AVL 树、红黑树)在多个行业中有广泛的应用,特别是在需要高效查找、插入和删除操作的场景中。以下是几个实际应用示例:

  1. 数据库索引:数据库系统经常使用平衡二叉搜索树来实现索引,这样可以在O(log n)的时间复杂度内查找数据。
  2. 操作系统调度:在操作系统中,平衡二叉搜索树可以用于管理进程队列,以实现优先级调度。
  3. 网络路由:在计算机网络中,路由器可以使用平衡树来存储路由表,并实现快速的路由查找。

通过合理设计和应用平衡二叉搜索树,可以在许多需要快速查找、插入和删除操作的应用中大大提高性能。

相关文章:

leetcode108:将有序数组转化为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[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%…...

程序员测试日常小工具

作为一名程序员&#xff0c;或者测试人员&#xff0c;日常工作最常用的工具有哪些&#xff0c;截图&#xff0c;截图漂浮&#xff0c;翻译&#xff0c;日期处理&#xff0c;api调用...&#xff0c; 当你拿到一串报文后&#xff0c;想要json转换时&#xff0c;是不是要打…...

Kubernetes: NetworkPolicy 的实践应用

一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范&#xff0c;用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...

HTML5滑块(Slider)

HTML5 的滑块&#xff08;Slider&#xff09;控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例&#xff1a; <…...

数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)

编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...

洪水灾害多智能体分布式模拟示例代码

1. 环境定义&#xff1a;支持灾害动态、地理数据和分布式架构 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 跟别人比 总结 投资一家公司就要选择会赚钱的公司&#xff0c;我们最为关心的莫过于公司的盈利能力&#xff0c;只有会下蛋的鸡才是好鸡&#xff0c;买股票为的就是获得利润。想成为一位成功的投资…...

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 使用端到端算法去识别水体范围的算法&#xff0c;针对哨兵2卫星遥感数据可用。 项目地址&#xff1a; https://github.com/cordmaur/WaterDetect 二、DeepWaterMap 深度卷积神经网络去…...

与你共度的烟火日常

见过不少人、经过不少事、也吃过不少苦&#xff0c;感悟世事无常、人心多变&#xff0c;靠着回忆将往事串珠成链&#xff0c;聊聊感情、谈谈发展&#xff0c;我慢慢写、你一点一点看...... 我和她一起收拾完屋子&#xff0c;忙完已经中午了。她说&#xff1a;“咱们去趟超市吧&…...

基于Python的社交音乐分享平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

Kafka的acks机制和ISR列表

Kafka 是一个流行的分布式流处理平台&#xff0c;用于构建实时数据流管道和应用程序。在 Kafka 中&#xff0c;acks 机制和 ISR&#xff08;In-Sync Replicas&#xff09;列表是两个重要的概念&#xff0c;它们共同确保消息的持久性和可靠性。 acks 机制 acks 机制是 Kafka 生…...

FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)

在讨论 ISR&#xff08;中断服务例程&#xff09;和 TCB&#xff08;任务控制块&#xff0c;Task Control Block&#xff09;时&#xff0c;我们实际上是在探讨 FreeRTOS 中两个不同但又相互关联的概念&#xff1a;一个是用于处理硬件或软件触发的中断事件&#xff0c;另一个是…...

【Spring】Spring DI(依赖注入)详解—自动装配—byType实现原理

一、引言 依赖注入&#xff08;Dependency Injection, DI&#xff09;是Spring框架的核心特性之一&#xff0c;它通过控制反转&#xff08;Inversion of Control, IoC&#xff09;来管理对象的生命周期和依赖关系。在实际应用中&#xff0c;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命令也可以…...

跨年战揭开本地生活新赛季:美团、抖音和快手争夺冰雪经济

元旦将至&#xff0c;冬季文旅消费渐至高潮。 2024年的文旅消费市场延续了去年冰雪游的热度&#xff0c;不断创下年内话题和热度新高。美团旅行数据显示&#xff0c;12月以来&#xff0c;雪场夜滑搜索热度同比增长65%&#xff0c;TOP5搜索城市分别是北京、乌鲁木齐、张家口、吉…...

从张宇考研课到Matlab实战:手把手教你用Grunwald-Letnikov公式实现分数阶求导

从数学理论到代码实践&#xff1a;Grunwald-Letnikov公式在分数阶求导中的完整实现路径 当我们在学习传统微积分时&#xff0c;整数阶导数&#xff08;如一阶导数表示变化率&#xff0c;二阶导数表示曲率&#xff09;的概念已经深入人心。然而&#xff0c;数学的世界远不止于此…...

别再死记硬背了!用一张图+一个案例彻底搞懂PROFIBUS-DP的令牌环与主从通信

工业现场通信革命&#xff1a;从零图解PROFIBUS-DP令牌环与主从机制 第一次接触PROFIBUS-DP协议文档时&#xff0c;那些晦涩的术语和抽象的状态转换图让我在调试现场设备时屡屡碰壁。直到某天亲眼目睹PLC通过一串神秘的数据包精准控制阀门阵列&#xff0c;才意识到这套诞生于上…...

bili2text终极指南:一键将B站视频转换为高质量文字稿的免费工具

bili2text终极指南&#xff1a;一键将B站视频转换为高质量文字稿的免费工具 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 你是否曾经为了整理B站视频中的精…...

别再踩坑了!手把手教你解决RPM安装时的‘.rpm.lock’事务锁定报错

RPM事务锁机制深度解析&#xff1a;从原理到避坑实战 在Linux系统管理中&#xff0c;RPM包管理器的.rpm.lock报错堪称经典"拦路虎"——据统计&#xff0c;超过63%的运维人员至少遭遇过一次这类锁定问题。这个看似简单的错误背后&#xff0c;隐藏着RPM设计精妙的事务隔…...

别再傻傻分不清了!用一张图看懂SRE、DevOps工程师和传统运维到底差在哪

从技能图谱到职业选择&#xff1a;SRE、DevOps与传统运维的实战边界 在数字化转型浪潮中&#xff0c;企业技术岗位的职责边界正经历着前所未有的重构。当招聘网站上同时出现"SRE工程师"、"DevOps专家"和"云运维主管"时&#xff0c;许多从业者会陷…...

2026年数字人拍摄新方式:一条视频能省多少时间

2026年数字人拍摄新方式&#xff1a;一条视频能省多少时间 【导语】 做视频最耗时间的是什么&#xff1f;不是拍摄那几分钟&#xff0c;而是前期的准备工作。但现在有一种新方式&#xff0c;可以让你完全不用拍摄真人&#xff0c;一条视频从准备到成片&#xff0c;最快只要7分钟…...

Perplexity被操控?数据溯源能力全解析,3类高危误判场景+实时交叉验证方案

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity被操控&#xff1f;数据溯源能力全解析&#xff0c;3类高危误判场景实时交叉验证方案 Perplexity 作为语言模型评估与推理可信度的关键指标&#xff0c;正面临日益隐蔽的数据污染与人为诱导风险。当…...

抢先李飞飞!世界模型能多人联机玩FPS游戏了

Jay 发自 凹非寺量子位 | 公众号 QbitAI我被AI杀了&#xff1f;有视频为证&#xff0c;我被一个不知道是人还是AI的东西&#xff0c;一枪崩了。还是在一个世界模型创造的世界里。嗯&#xff0c;就是这个画质糊成马赛克的网页版FPS。背后没有游戏引擎&#xff0c;没有物理规则&a…...

2026 年 AI 编程工具横评:Claude Code、Cursor、Copilot、Codex 谁才是真正的生产力?

爆款标题备选我把五个 AI 编程工具全装了一遍&#xff0c;只有一个让我想付费Claude Code vs Cursor vs Copilot&#xff1a;2026 开发者选型实战指南Copilot 的垄断结束了——2026 AI 编程工具真实横评花了一周用 AI 编程 Agent 写项目&#xff0c;最后留下了这一个AI 编程工具…...

快速完成一篇重复率和AI率都很低的英文论文!(亲测有效)

写英文论文对于很多同学来说比较困难&#xff0c;今天给大家分享一下如何快速完成一篇英文论文。 直接说操作方法&#xff1a; 一、打开任何一个AI工具&#xff0c;输入指令&#xff1a;我是英文专业的毕业生&#xff0c;我的论文题目是《XXXX》&#xff0c;论文正文8000字&a…...