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

【5.10】指针算法-快慢指针将有序链表转二叉搜索树

一、题目

        给定一个单链表,其中的 元素按升序排序 ,将其转换为 高度平衡的二叉搜索树
        本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。

示例:
给定的有序链表: [ -10 , -3 , 0 , 5 , 9 ],
一个可能的答案是: [ 0 , -3 , 9 , -10 , null , 5 ],
它可以表示下面这个高度平衡二叉搜索树:
          0
        /    \
     -3      9
     /       /

  -10     5

二、解题思路

        二叉搜索树具有这样的特点:当前节点大于左子树的所有节点,同时小于右子树的所有节点,并且每个节点都具备这个特性。

        题中提到,是按照升序排列的单链表,我们只需找到链表的中间节点,使其成为树的根节点。中间节点前面的部分就是根节点左子树的所有节点,中间节点后面的部分就是根节点右子树的所有节点。然后,使用递归的方式再分别对左右子树进行相同的操作……

        这里以链表 1→2→3→4→5 为例来画个图看一下。

        上面链表的中间节点3就是二叉搜索树的根节点,然后再对左右子节点以同样的方式进行操作。最后我们来看看实现代码。

三、代码实现

#include <iostream>
#include <vector>
#include <queue>// 定义链表节点
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};// 定义树节点
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 将有序链表转换为二叉搜索树
TreeNode* sortedListToBST(ListNode* head) {// 边界条件的判断if (head == nullptr)return nullptr;if (head->next == nullptr)return new TreeNode(head->val);// 通过快慢指针找到链表的中间结点slow,pre就是中间结点slow的前一个结点ListNode* slow = head;ListNode* fast = head;ListNode* pre = nullptr;while (fast != nullptr && fast->next != nullptr) {pre = slow;slow = slow->next;fast = fast->next->next;}// 链表断开为两部分,一部分是node的左子节点,一部分是node的右子节点pre->next = nullptr;// node就是当前节点TreeNode* node = new TreeNode(slow->val);// 从head节点到pre节点是node左子树的节点node->left = sortedListToBST(head);// 从slow.next到链表的末尾是node的右子树的结点node->right = sortedListToBST(slow->next);return node;
}// 打印树的层序遍历结果
void printTreeLevelOrder(TreeNode* root) {if (root == nullptr)return;std::queue<TreeNode*> q;q.push(root);bool first = true;while (!q.empty()) {int size = q.size();for (int i = 0; i < size; ++i) {TreeNode* node = q.front();q.pop();if (!first) {std::cout << ", ";}first = false;if (node != nullptr) {std::cout << node->val;q.push(node->left);q.push(node->right);} else {std::cout << "null";}}}std::cout << std::endl;
}// 创建链表
ListNode* createLinkedList(const std::vector<int>& values) {ListNode* dummy = new ListNode(0);ListNode* current = dummy;for (int val : values) {current->next = new ListNode(val);current = current->next;}return dummy->next;
}int main() {// 输入给定的有序链表:[-10, -3, 0, 5, 9]std::vector<int> values = {-10, -3, 0, 5, 9};ListNode* head = createLinkedList(values);// 将有序链表转换为二叉搜索树TreeNode* root = sortedListToBST(head);// 打印树的层序遍历结果std::cout << "[";printTreeLevelOrder(root);std::cout << "]" << std::endl;return 0;
}

相关文章:

【5.10】指针算法-快慢指针将有序链表转二叉搜索树

一、题目 给定一个单链表&#xff0c;其中的 元素按升序排序 &#xff0c;将其转换为 高度平衡的二叉搜索树 。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表&#xff1a; [ -10 , -3 , 0 , …...

机器学习—前向传播的一般实现

可以写一个函数来实现一个密集的层&#xff0c;那是神经网络的单层&#xff0c;所以定义稠密函数&#xff0c;它将上一层的激活作为输入以及给定层神经元的参数w和b。看下边图片所展示的例子&#xff0c;把所有这些权重向量堆叠成一个矩阵&#xff0c;wnp.array([[1,-3,5][2,4,…...

极狐GitLab 签约足下科技,加速国产智驾操作系统的发展与普及

客户背景 足下科技是一家致力于成为智能汽车软件平台、产品与服务领导者的高科技企业&#xff0c;成立于 2022年 3 月&#xff0c;总部位于深圳市。足下科技自主研发的智能驾驶操作系统 Earth 和 Air 工具链&#xff0c;协助OEM和Tier1厂商降低算法和软件开发难度&#xff0c;…...

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N 2024/11/2 18:04 在WIN10使用程序&#xff1a;ViewLink-4.0.7_0708-windows-x64.exe 在荣品PRO-RK3566开发板的预置Android13下使用&#xff1a;ViewLink-2023_12_21-release-0.2.6.apk adb install…...

力扣(leetcode)题目总结——哈希表篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…...

AWS RDS Oracle hit ORA-39405

报错信息&#xff1a; ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version 42 into a target database with TSTZ version 35. 分析过程&#xff1a; 这个报错是由于timezone_file的版本&#xff0c;源端比目标端高&#xf…...

Dinky中配置Flink集群

需要启动yarn-session 进程&#xff0c;在集群服务器 cd /pwd//flink/bin yarn-session -d 启动成功后可以在yarn的资源管理队列进行查看 启动成功后会给出&#xff1a;JobManager Web Interface 在dinky中进行配置&#xff1a; 集群配置 Hadoop 配置&#xff1a; H…...

通讯录(C 语言)

目录 一、通讯录设计思路1. 伪代码设计思路2. 代码设计思路 二、代码实现三、程序运行演示四、整体分析 一、通讯录设计思路 1. 伪代码设计思路 通讯录可以用来存储 100 个人的信息&#xff0c;每个人的信息包括&#xff1a;姓名、性别、年龄、电话、住址。 提供方法&#x…...

对比Java和TypeScript中的服务注册和查找机制

文章目录 一、Java中的服务注册和查找二、TypeScript中的服务注册和查找2.1 使用依赖注入&#xff08;DI&#xff09;框架2.2 injectable原理2.3 使用TypeScript的反射系统实现依赖注入 三、优缺点分析3.1 Java的ServiceLoader3.2 TypeScript的服务注册和查找 四、结论 在构建大…...

Flutter 主流常用第三方库、插件收集

一、Flutter 学习资料 FlutterFlutter官网Flutter中文网咸鱼技术掘金Flutter专栏 Flutter - Dart中(.)、(..)、(...)语法使用_flutter ...-CSDN博客 Flutter pubspec.yaml 配置文件_flutter yaml配置git-CSDN博客 Flutter 添加 example流程_建flutter 工程 怎么自动有example-C…...

【在Linux世界中追寻伟大的One Piece】多路转接select

目录 1 -> I/O多路转接之select 1.1 -> 初识select 1.2 -> select函数原型 1.3 -> 关于fd_set结构 1.4 -> 关于timeval结构 2 -> 理解select执行过程 2.1 -> Socket就绪条件 2.2 -> select特点 2.3 -> select缺点 3 -> select使用示例…...

补一下 二维 平面直角坐标系 到三维

上一篇帖子写到 二维的平面直角坐标系&#xff0c;是那样的&#xff0c;这次补充一下三维的。首先需要&#xff0c;安装一个包&#xff0c;如下&#xff1a; 然后&#xff0c;把参数输入&#xff0c;输入这个坐标系的参数&#xff0c;如下&#xff1a; 这样就可以输出如下的三…...

如何学习Python编程?

如何学习Python编程&#xff1f; 了解基础概念&#xff1a; 学习Python的基本语法&#xff0c;包括变量、数据类型、运算符等。了解控制结构&#xff0c;如条件语句&#xff08;if语句&#xff09;和循环&#xff08;for和while循环&#xff09;。 选择学习资源&#xff1a; 在…...

使用EasyExcel实现导出excel文件时生成多级下拉选

前言 公司有个需求本来只涉及到两个下拉选项&#xff0c;后面就想能不能实现多个下拉选&#xff0c;当然我这里说的多个下拉选是联动的&#xff0c;比如省、地市、区县这种。 实现步骤 1、添加EasyExcel的Maven依赖 <dependency><groupId>com.alibaba</group…...

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色&#xff0c;分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…...

从0开始的STM32 定时器(I):聊一聊基本定时器

目录 时钟源 控制器 时基单元 关于HAL库如何配置基本定时器 HAL是如何初始化我们的定时器句柄的 HAL_TIM_Base_Init 开始定时 如何处理句柄&#xff1f; 在我们使用STM32解决一些问题的时候&#xff0c;常常会遇到说&#xff1a;我想要以一个周期做一些事情&#xff1a;…...

vue常见题型(1-10)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 2.2双向绑定的原理是什么vue框架采用的是数据双向绑定的方式&#xff0c;由三个重要部分构成2.2.1.ViewModel2.2.2 双向绑定2.2.3.1.编译Compile2.2.3.2.依赖收集 3…...

【SpringBoot】使用注解进行XSS防御

在Spring Boot中&#xff0c;我们可以使用注解的方式来进行XSS防御。注解是一种轻量级的防御手段&#xff0c;它可以在方法或字段级别对输入进行校验&#xff0c;从而防止XSS攻击。 引入相关依赖 maven依赖&#xff1a; <!--JSR-303/JSR-380用于验证的注解 --> <de…...

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——模拟芯片 真题题目分享&#xff0c;完整题目&#xff0c;无答案&#xff08;共8套&#xff09; 实习岗位…...

vscode 下载慢的解决方法

下载链接示例&#xff1a;https://az764295.vo.msecnd.net/stable/ccbaa2d27e38e5afa3e5c21c1c7bef4657064247/code1.62.3-1637137107amd64.deb 解决方法&#xff1a; 把 az764295.vo.msecnd.net 替换成 vscode.cdn.azure.cn...

构造函数、this指向和原型链机制

今天在刷力扣 [146. LRU 缓存](https://leetcode.cn/problems/lru-cache/) 的时候&#xff0c;遇到了原型链的写法&#xff0c;想想这个写法我正式开发中从来都没有用过&#xff0c;到底是个什么玩意&#xff1f;遂将各个节点和变量都定义在外面&#xff0c;但是代码居然报错啦…...

从账单明细看Taotoken计费模式的透明与可追溯性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从账单明细看Taotoken计费模式的透明与可追溯性 对于将大模型API集成到产品中的团队而言&#xff0c;成本控制与核算是一个核心的工…...

终极指南:macOS上轻松解密QQ音乐加密音频文件

终极指南&#xff1a;macOS上轻松解密QQ音乐加密音频文件 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结果存…...

CANN/asc-devkit RTC运行时编译指南

RTC 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann/a…...

QQ空间数据备份指南:三步骤永久保存你的数字青春

QQ空间数据备份指南&#xff1a;三步骤永久保存你的数字青春 【免费下载链接】QZoneExport QQ空间导出助手&#xff0c;用于备份QQ空间的说说、日志、私密日记、相册、视频、留言板、QQ好友、收藏夹、分享、最近访客为文件&#xff0c;便于迁移与保存 项目地址: https://gitc…...

G-Helper:轻量级开源硬件控制工具的深度技术解析

G-Helper&#xff1a;轻量级开源硬件控制工具的深度技术解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertb…...

基于知识图谱InsightGraph — 让数据开口说话。

从Palantir的ontology思路出发&#xff0c;我们踩了一遍知识图谱的坑让数据从"分散的资产"&#xff0c;变成"会分析、会归因的业务伙伴"&#x1f4bc;你一定遇到过这些问题这份数据和其他系统能不能关联&#xff1f;问了三个人有三个答案运营问"为什么…...

Unity IL2CPP运行时调试:Frida-il2cpp-bridge实战指南

1. 这不是“教你怎么黑游戏”&#xff0c;而是Unity开发者该懂的底层透视镜你有没有在调试一个Unity项目时&#xff0c;突然发现某个C#方法的行为和预期完全不符&#xff0c;但断点打进去却卡在IL2CPP生成的汇编里&#xff0c;连变量名都看不到了&#xff1f;或者你在做性能优化…...

冬季施工安全措施,附: 冬季施工总安全技术交底

冬季施工安全措施,附: 冬季施工总安全技术交底 冬季施工特点 1 冬季施工由于施工条件及环境不利,是工程质量事故的多发季节,尤以混凝土工程、钢结构工程居多。如何在冬季施工、抢赶工期的条件下保证项目的质量目标,是施工技术和施工组织的难点。 3 质量事故出现的隐蔽性…...

VMware虚拟机安装及配置

密码 # 设置 root 用户密码 sudo passwd root修改国内镜像源 在 Ubuntu 24.04 之前&#xff0c;Ubuntu 的软件源配置文件路径为 /etc/apt/sources.list&#xff1b;从 Ubuntu 24.04 开始&#xff0c;Ubuntu 的软件源配置文件变更为 DEB822 格式&#xff0c;路径为 /etc/apt/so…...