【剑指offer-C++】JZ36:二叉搜索树与双向链表

绿色免安装拼图工具 PintuMaster 1.6 技术解析:不写注册表、不占 C 盘,如何实现 0 成本搞定证件照/发票拼图? 文章摘要: PintuMaster 1.6 是一款绿色免安装的轻量级拼图工具,专注解决证件照、发票和常规图片拼接需求,避免传统大型软件的资源占用问题。其核心优势包括: 零系统侵入:不写注册表、不占C盘,配置临时文件均存储于软件目录; 高效算法:支持网格布局、证件照模板化排版及发票A4合并,优化插值压缩质量; 极简体验:解压即用,内存占用低(200-350MB),启动速度快(1秒内),输出效率高; 安全可信:完全本地运行,无后台服务,适合办公、财务及技术爱好者。 阅读详情

【剑指offer-C++】JZ36:二叉搜索树与双向链表

题目描述

描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示:

在这里插入图片描述

数据范围:输入二叉树的节点数 0≤n≤1000,二叉树中每个节点的值 0≤val≤1000。

要求:空间复杂度O(1)(即在原树上操作),时间复杂度O(n)。

注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继;
2.返回链表中的第一个节点的指针;
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构;
4.你不用输出双向链表,程序会根据你的返回值自动打印输出;

输入描述:二叉树的根节点。
返回值描述:双向链表的其中一个头节点。

输入:{10,6,14,4,8,12,16}
返回值:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;
说明:输入题面图中二叉树,输出的时候将双向链表的头节点返回即可。 
输入:{5,4,#,3,#,2,#,1}
返回值:From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;
说明:
                    5
                  /
                4
              /
            3
          /
        2
      /
    1
树的形状如上图     

解题思路

二叉搜索树与双向链表:最直观的想法是,中序遍历二叉搜索树,并使用一个数组保存中序遍历的结点指针结果,再遍历中序数组将其左右相连,最后返回中序遍历数组的第一个元素即可。

vector<TreeNode*> TreeList; //中序遍历数组
//中序遍历 得到中序遍历数组
void dfs(TreeNode* cur)
{
	if(!cur)
	  return;
	dfs(cur->left);
	TreeList.push_back(cur);
	dfs(cur->right);
}
TreeNode* Convert(TreeNode* pRootOfTree) 
{
    if(!pRootOfTree) //空树
	  return nullptr;
	dfs(pRootOfTree);
	for(int i=0;i<TreeList.size()-1;i++) //遍历中序数组 左右相连
	{
	   TreeList[i]->right=TreeList[i+1];
	   TreeList[i+1]->left=TreeList[i];
	}
	return TreeList[0];
}

优化:上述方法开辟了额外的数组存储空间,那么有没有什么原地操作的方法呢?当然有!使用二叉树双指针即可!其中使用一个指针pre表示前驱结点,使用一个指针cur表示当前结点,仍然使用中序遍历方法,当左子树遍历完成后,即肯定cur->left为空才返回,此时将cur->left设置为前驱节点,同时,如果pre不为空的话,当前节点必定为前驱节点的后继节点,即pre->right=cur,当然,也要更新前驱节点为当前结点,再继续右子树的遍历,最后返回二叉树的最左下即中序遍历的开头结点即可。(其实就是中序遍历,然后在处理中间结点时,其左边指向前驱,如果前驱不为空,那么前驱的后继就指向当前,这样就避免了再遍历一次来完成后继的填充,其与数组类似,只不过是将数组转化为了指针)

TreeNode *pre=nullptr;
//中序遍历 得到中序遍历数组
void dfs(TreeNode* cur)
{
	if(!cur) //叶子结点
	  return;
	dfs(cur->left); //左子树遍历
	cur->left=pre;  //更新前驱
	if(pre) //更新后继
	  pre->right=cur;
	pre=cur; //更新下一次的前驱
	dfs(cur->right);  //右子树遍历
}
TreeNode* Convert(TreeNode* pRootOfTree) 
{
    if(!pRootOfTree) //空树
	  return nullptr;
	dfs(pRootOfTree); //中序遍历
	while(pRootOfTree->left) //找到最左下
	  pRootOfTree=pRootOfTree->left;
	return pRootOfTree; //双向链表头结点
}

注意,是通过更新当前的左子树为前驱,同时当前驱不为空,来更新前驱的右子树为当前来实现双向奔赴的啊!!

EtherCAT主站SOEM -- 51 -- SOEM2.0之ec_main.h/c主站上下文运行主线解析 `ec_main.c/h`把 SOEM 2.0 的“主站运行时对象”组织在一个显式 context 中:错误栈负责把异常带回应用,EEPROM 缓存负责支撑扫描和配置,邮箱池负责协议事务所有权,idx 栈负责把非阻塞过程数据重新组合。理解这四条路径后,再阅读 `ec_config.c`、`ec_coe.c`和各 XoE 文件会更容易判断数据究竟来自哪个层。 阅读详情

相关推荐

图片处理助手|C++ 手搓离线 AI 涂鸦工坊,BiSeNet 分割 + 11 步风格化一次讲透

一条别人没做的链路:照片 → 人脸分割 → 风格化 → 贴纸画布,全离线;AI 只干最贵的活:BiSeNet 跑一次出类图,剩下的交给 11 步经典视觉算子,滑条级实时预览;细节靠传统算法堆:手绘感(模糊+阈值+噪声)、水彩感(距离变换渗色)、像素风(最近邻缩放)——没有第二张「魔法」网络,全是 OpenCV 老伙计;交互即产品:拖拽/缩放/旋转/置顶/去背/泊松融合,贴纸的手感就是体验。后续展望:风格化流水线参数化做成「风格预设」(一键切换水墨风/蜡笔风);泊松融合增加交互式中心点选择;

qq_29676069的博客 269

剑指offer(C++)-JZ36二叉搜索树双向链表(数据结构-树)

C++实现——二叉搜索树双向链表(数据结构-树)

翟天保的博客 1894

图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透

现象:边缘微调滑到最左(强腐蚀),点融合,程序崩溃或花屏。原因:掩码被腐蚀成全零,对全零掩码是未定义行为。解决守卫,跳过该贴纸并写日志(第五章代码)。原理一句话:内部保梯度、边界锚颜色,解一个泊松方程,接缝就没了;三模式 = 引导场的三种选法:NORMAL 全搬、MIXED 搬纹理、MONO 只搬纹理走向;工程细节决定手感:掩码膨胀留缓冲、腐蚀去白边、全零守卫、出界跳过、变换后重二值化;缓存换体验:三模式一次算完,切换零等待。

qq_29676069的博客 309

剑指offer——JZ36 二叉搜索树双向链表 解题思路具体代码【C++

剑指offer——JZ36 二叉搜索树双向链表 解题思路具体代码【C++

m0_59800431的博客 223

剑指offer刷题记录

剑指offer

orz_include的博客 247

剑指offer刷题总结(c++

大部分是官方题解或者是别人比较好的思路,有一些是自己写的。仅作为自己的学习笔记!

syuichihann的博客 1099

专题:剑指offer

JZ6 从尾到头打印链表思路:先顺序输出到栈里面 然后再以此从栈顶弹出即可 JZ24 反转链表思路:借助虚拟头结点进行头插法 JZ25 合并两个排序的链表方法一:迭代法 方法二 递归: JZ52 两个链表的第一个公共结点方法一:循环遍历两个链表 方法二·:遍历长链表 先快走几步 后面和端链表一起同步走 方法一 方法二 JZ23 链表中环的入口结点 思路:快慢指针 循环体内 快指针每次走两步 慢指针每次走一步 能够相遇也就是说明有环 然后 慢指针从头开始 另外一个指针从相遇节点开始 判断是否再次相遇 不相遇

qq_23923713的博客 629

【牛客剑指offer数据结构——树——中等

JZ55 二叉树的深度 简单 50.43% JZ77 按之字形顺序打印二叉树 中等 29.21% JZ54 二叉搜索树的第k个节点 中等 40.91% JZ7 重建二叉树 中等 27.71% JZ26 树的子结构 中等 25.63% JZ27 二叉树的镜像 简单 67.76% JZ32 从上往下打印二叉树 简单 29.99% JZ33 二叉搜索树的后序遍历序列 中等 25.36% JZ82 二叉树中和为某一值的路径(一) 简单 41.09% JZ34 二叉树中和为某一值的路径(二) 中等 28.83% JZ

weixin_46046227的博客 249

剑指Offer(第2版)》读书笔记

目录第1章 面试的流程1.3 面试的3个环节1.3.2 技术面试环节第2章 面试需要的基础知识2.2 编程语言2.2.1 C++ 第1章 面试的流程 1.3 面试的3个环节 1.3.2 技术面试环节 1.扎实的基础知识 P11 传入值参数和传入引用参数有什么区别、什么时候需要为传入的引用参数加上const https://blog.csdn.net/sammie123321/article/details/96426851 第2章 面试需要的基础知识 2.2 编程语言 2.2.1 C++C++种,有哪4

boss-dog 1124

从CVI(C)到Pyside(python)/Qt(C++)/VS(C#)的一点吐槽

Tkinter 布局助手”,是我接触过的基于python原生的图形界面套件Tkinter来做GUI程序的最佳实践,链接是https://www.pytk.net/],在web上就可以拖拽基础控件到面板,并定义控件的回调函数,完了存盘到本机。我曾经死抱着CVI不放,没有去追逐更现代的IDE,究其原因,主要是以前没有 AI 辅助编程,很多新 IDE 摸都不敢摸,随便一个编译报错或环境配错,就会卡死我半天。所以,遇到我这样,时不时输出一个学习心得的老工程师,也应该算是一种缘分了,很罕见的哦。

qq_15084199的博客 207

DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」

DuckDB是一个纯 C++ 实现的、进程内嵌入式的分析型(OLAP)SQL 数据库,采用 MIT 开源协议。你肯定听说过SQLite——它把数据库"装进"你的程序里,不用装服务器,一个文件就是一个库。SQLite 是**事务型(OLTP)**数据库,擅长"频繁地增删改查单条数据"。DuckDB 就是 SQLite 的"分析型"亲戚:同样不用装服务器、同样嵌入进程,但它专门为"对大量数据做聚合、统计、分组、连接"这类分析查询优化。打个比方:SQLite 像"便利店收银机",每秒能处理很多笔小交易;

ITOfDragon的博客 381

C++二叉搜索树(练习题)

给定一棵n个结点的二叉搜索树,要求其中第k小的值(k<=n)。数据保证输入的是二叉搜索树。【输入描述】第一行是一个整数 n, 表示二叉树的结点个数。二叉树结点编号从 1到 n(1<= n <= 10) , 根结点为 1。接下来有 n 行, 依次对应二叉树的 n 个结点。每行有3个整数, 分别表示该结点的值、左儿子和右儿子的结点编号。如果第2个(第3个) 数为-1 则表示没有左(右) 儿子。最后一行一个整数表示k(k<=n)。【输出描述】一个整数表示二叉搜索树中第k小的值。

weixin_46669997的博客 201

LeetCode //C - 1200. Minimum Absolute Difference

Abstract: The problem asks to find all pairs of elements with the smallest absolute difference in an array containing distinct integers and return these pairs in ascending order. The solution involves first sorting the array, then comparing the differences

Made in Code 383

Cordis Effect 对比 React useEffect-Day18

本文对比了React的useEffectCordis的Effect机制。useEffect用于处理组件渲染后的副作用清理,React渲染周期绑定,依赖变化时重复执行;而Cordis Effect用于插件系统的可逆组合,插件生命周期绑定,仅在加载/卸载时执行一次。

m0_51089660的博客 365

一张图怎么变成197个Token:用纯C/C++跑视觉Transformer的完整实现

本文介绍了一个轻量级的视觉Transformer(ViT)推理引擎实现方案,该项目使用C/C++和ggml张量计算库,旨在摆脱传统深度学习框架的庞大依赖。核心特点包括:1)支持多种ViT变体,可将模型量化至4/5/8-bit,内存占用仅为PyTorch的1/39;2)单文件可执行,启动速度快,特别适合serverless部署;3)完整实现了ViT的关键组件,包括图像预处理、Patch Embedding、位置编码、12层Transformer Encoder和分类头。文章详细解析了各模块的代码实现原理,展示

chen1415886044的博客 330

【C语言】if else分支判断+for循环基础

2、for(i=1;i++):循环让i依次取1、2、3.......100,逐个加所有数字。累加公式等价写法:sum+=i.第一次循环:sum=0+1=1,第二次循环:sum=1+2=3;i++):i=1:循环从1开始。}循环体,每次循环都会执行这一句:打印当前i的值,\n是换行,每个数字单独占一行。固定分数score=86,按照规则评级:>=90优秀,80~89良好,60~79及格,<60不及格。固定a=12,b=45,c=29,程序自动找出三个数里面的最大值。

2601_96469072的博客 508

ReactOS 图形系统分析(48):弧线绘制 — arc.c

arc.c是 win32k(内核态 GDI)中负责弧线绘制的模块,实现了 Windows 的ArcArcToChordPieAngleArc五个 API 的内核部分。整个模块只包含两个系统调用入口()和三个内部函数(、静态的IntArc),全部代码 408 行。应用层(user32 / gdi32)│├─ ArcTo() ──→ NtGdiArcInternal(GdiTypeArcTo, ...) │ 用户态包装│ 经 win32u.dll 进入内核▼│ arc.c ││ │ │。

大坡3D软件开发 183

简述:C++ 内核 + .NET 封装 vs C++ 内核 + Java 封装:桌面 GIS 架构深度对比

简述:C++ 内核 + .NET 封装 vs C++ 内核 + Java 封装:桌面 GIS 架构深度对比

hsg77的专栏 473
上一篇: 【剑指offer-C++】JZ35:复杂链表的复制
下一篇: 【剑指offer-C++】JZ37:序列化二叉树
雾里看花花里看雾
博客等级 码龄8年 657粉丝 · 416原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值