将有序数组转换为二叉树

news/2024/11/17 22:33:18/

md这个破CSDN模板怎么没了,编辑器也死难用,气死

1、题目

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

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 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] 都是高度平衡二叉搜索树。

2、链接

题目:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

视频:构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树_哔哩哔哩_bilibili

 3、解题思路

那我就瞎写了,希望复习回来的时候自己还记得

典型的双指针法+递归

注意题目给的是平衡二叉树,所以我们只要把这个有序数组nums取中间值作为二叉树的根节点就好了

还要注意的事,使用双指针一定要规定好左右区间,本文我用的是左闭右开--> [left, right)

递归三部曲:

1.确定函数返回值和传入参数

TreeNode* traversal(vector<int>& nums, int left, int right)

2.确定终止条件

这个递归到什么时候结束呢,显而易见是在区间不断缩减的过程中,出现了区间不成立的时候

if (left >= right) return nullptr;

md直到现在我才想通为什么递归最后一层返回的事nullptr,因为最下一层叶子指向的是nullptr啊,return这个关键词告诉程序递归结束,顺便抛出了一个nullptr放在最后一层的下面罢了

3.确定单层递归逻辑

前面说了,找nums这个有序数组的中值作为二叉树的根节点,怎么找呢?

用int mid = (left + right) / 2;?  那可不行,万一right == INT_MAX不就越界了吗。所以应该这样写:int mid = left + ((right - left) / 2);

千万别觉着mid是小数怎么办,小数会被自动向下取整变为整数,莫得影响

        int mid = left + (right - left) / 2; //自动转换小数,向下取整TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums, left, mid);root->right = traversal(nums, mid+1, right);return root;

展示一下随手画的东西:(这什么破编辑界面都不能旋转图片)

 递归完就是这个东西:

 4、全部代码

 最近懒得让AI给我注释代码了,因为的确简单的很,没必要

class Solution {
public://nums取地址的原因是:不取地址每次递归都会重新复制内存,空间消耗大TreeNode* traversal (vector<int>& nums, int left, int right) {if (left >= right) return nullptr; // [ )//int mid = (left + right) / 2; //如果right是int最大值,就会越界int mid = left + (right - left) / 2; //自动转换小数,向下取整TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums, left, mid);root->right = traversal(nums, mid+1, right);return root;}TreeNode* sortedArrayToBST(vector<int>& nums) {TreeNode* root = traversal(nums, 0, nums.size());return root;}
};

 


http://www.ppmy.cn/news/73335.html

相关文章

异地研发团队都使用哪些研发协同工具?盘点7类最主流的研发管理协同软件

产品研发场景下好用的协同办公软件有哪些&#xff1f;分享7类研发过程中主流的协同办公软件&#xff0c;比如项目管理协作与问题跟踪工具PingCode、代码托管与版本控制平台github、持续集成与持续部署&#xff08;CI/CD&#xff09;工具jinkens、文档协作与知识管理工具conflue…

Node开发Web后台服务

简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。Node.js 的包管理器 npm&#xff0c;是全球最大的开源库生态系统。 能方便地搭建响应速度快、易于扩展的网络应用&#…

支付宝沙箱支付(java电脑版)

目录 下载支付demo配置环境AlipayConfig 下载支付demo 网址&#xff1a;https://open.alipay.com/ 下载并打开项目发现无法运行&#xff1a; 手动转化项目&#xff1a; 等待下载整理一下maven pom 通过tomat部署运行测试。 导入阿里支付的pom依赖 <dependency> &l…

《计算机网络—自顶向下方法》 Wireshark实验(十):NAT 协议分析

NAT&#xff08;Network Address Translation&#xff09;网络地址转换&#xff0c;即在私有地址和全局地址之间转换的协议。私有地址是不能用在 Internet 上(路由器将丢弃寻址这种地址的包)的内部地址。这些地址是不能够在公网上面用的&#xff0c;只能用在局域网的内部。私有…

可以白嫖的语音识别开源项目whisper的搭建详细过程 | 如何在Linux中搭建OpenAI开源的语音识别项目Whisper

原文来自我个人的博客。 1、前提条件 服务器为GPU服务器。点击这里跳转到我使用的GPU服务器。我搭建 whisper 选用的是 NVIDIA A 100显卡&#xff0c;4GB显存。 Python版本要在3.8~3.11之间。 输入下面命令查看使用的Python版本。 python3 -V2、安装Anaconda 为啥要安装A…

教材管理系统

目 录 第一章 引言 3 1.1 背景 3 1.1.1教材管理系统 3 1.1.2信息管理系统 3 1.2开发教材管理系统的目的和原则 5 1.3开发环境介绍 6 1.3.1 开发平台 6 1.3.2 数据库查询语言——SQL 8 1.3.3 数据库设计工具——ACCESS数据库管理系统 9 第二章 系统设计 11 2.1 系统分析 11 2.2 …

惯性导航论文详解:神经惯性定位

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;Neural Inertial Localization 论文链接: https://arxiv.org/pdf/2203.15851v1.pdf 图1.从IMU测量到位置估计。给定惯性传感器数据&#xff08;左&#xff09;&#xff0c;我们的方法…

面了一个测试工程师要求月薪26K,总感觉他背了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…