剑指Offer(数据结构与算法面试题精讲)C++版——day16
剑指Offer(数据结构与算法面试题精讲)C++版——day16
- 题目一:序列化和反序列化二叉树
- 题目二:从根节点到叶节点的路径数字之和
- 题目三:向下的路径节点值之和
- 附录:源码gitee仓库
题目一:序列化和反序列化二叉树
题目:如图8.3所示,请设计一个算法将二叉树序列化成一个字符串,并能将该字符串反序列化出原来二叉树的算法。
这里考查的其实是二叉树的创建和输出,只需要固定使用前序、中序或者后序遍历即可,比如构建二叉树的时候使用前序遍历,在进行反序列化的时候同样使用前序遍历的方式输出。由于这里需要反序列化为字符串,使用#标识空节点,因此二叉树的数据类型使用char类型。考虑到需要使用参数的形式去序列化构建一颗二叉树,这里使用输入的流的形式不太方便,分析发现可以使用一个队列结构,将需要字符串读入到队列中,然后采用引用类型调用这个存储了字符的队列来构建二叉树,这样就能够实现字符串序列化成一颗二叉树,最终可以得到如下代码:
treeNode* createTree(queue<char>& qu) {char val=qu.front();qu.pop();if(val=='#') {return nullptr;} else {treeNode* node=new treeNode(val);node->left=createTree(qu);node->right=createTree(qu);return node;}
}
treeNode* deserialize(string data) {queue<char> qu;for(int i=0,size=data.length(); i<size; ++i) {qu.push(data[i]);}return createTree(qu);
}
void serialize(treeNode* tree) {treeNode * p=tree;if(p==nullptr) {cout<<"#";return;} else {cout<<p->val;serialize(p->left);serialize(p->right);}
}

题目二:从根节点到叶节点的路径数字之和
题目:在一棵二叉树中所有节点都在0~9的范围之内,从根节点到叶节点的路径表示一个数字。求二叉树中所有路径表示的数字之和。例如,图8.4的二叉树有3条从根节点到叶节点的路径,它们分别表示数字395、391和302,这3个数字之和是1088。

由于需要统计从根节点到叶子节点路径数字和,那么需要拿到所有根节点到叶子节点的路径。我们还能够发现,这里可以考虑使用递归来简化代码逻辑,以395这条路径为例,拿到3节点之后,相当于需要得到以9节点和0节点为根节点到叶子节点的和,这里存在一种数值关系,原根节点到叶子节点的和=上一级*10+下一级节点(新根节点)的路径和。
接下来,分析如何拿到根节点到叶子节点的所有路径,从根节点向下一级节点探索,每次都需要探索左子节点和右子节点,这里立刻会想到前序遍历,当前序遍历拿到最后一个节点,即叶子节点,那么说明路径完整了,这时候终止前面提到的上一级*10+下一级节点(新根节点)的路径和这一遍历过程。于是得到如下代码:
int dfs(treeNode* tree,int path) {if(tree==nullptr) {return 0;}path=path*10+tree->val;if(!tree->left&&!tree->right) {return path;}return dfs(tree->left,path)+dfs(tree->right,path);
}int getAllPathSum(treeNode* tree) {return dfs(tree,0);
}
这里的代码将递推关系和前序遍历巧妙的结合起来,这里再回过头捋一下思路,由于发现可以使用递归的形式计算下层根节点到叶子节点的值,因此可以整体上使用dfs(tree->left)+dfs(tree->right)的形式实现,递归的出口有两个:
(1)一开始树就为空,或者子树左右两边中一边为空;
(2)递归扫描到了叶子节点;
为了保证每次path值都能带入之后的计算,所以使用参数dfs传参的方式向后传递,这里巧妙的是利用dfs(tree,0)开启扫描,让入口和接下来的遍历递推关系统一起来。
题目三:向下的路径节点值之和
题目:给定一棵二叉树和一个值sum,求二叉树中节点值之和等于sum的路径的数目。路径的定义为二叉树中顺着指向子节点的指针向下移动所经过的节点,但不一定从根节点开始,也不一定到叶节点结束。例如,在如图8.5所示中的二叉树中有两条路径的节点值之和等于8,其中,第1条路径从节点5开始经过节点2到达节点1,第2条路径从节点2开始到节点6。

结合上一题的思路,这里同样是需要使用先根节点、然后左孩子、右孩子的先序深度遍历,区别在于这里的path值计算不一致,前面是用位数统计,这里只需要统计和。由于题意中描述说这里不仅仅需要考虑到跟到叶子节点的可能路径数,还需要考虑到中间节点到其余节点的可能值,因此既需要考虑携带path向后递归,又需要考虑不携带path从新节点触发的可能路径数。还有一种情况需要考虑,在图的深度优先遍历时,我们常常需要考虑剪枝,这里由于没有说明每个节点的数值是多少(没有说每个节点的数值都是正数),因此不能提前找到路径就终止递归。于是得到如下代码:
void dfs(treeNode* tree,int path,int sum,int& count) {if(tree==nullptr) {return;}path=path+tree->val;if(path==sum) {count++;}if(!tree->left&&!tree->right) {return;}dfs(tree->left,path,sum,count);//携带传值dfs(tree->right,path,sum,count);dfs(tree->left,0,sum,count);//不携带传值dfs(tree->right,0,sum,count);
}

这里可以得到一下总结,在使用递归的时候,需要明确如下几点:
(1)递归入口以及进入递归的方式;
(2)递归出口;
(3)递归的递推方式;
对于统计可以视情况使用引用类型参数,比如这里巧妙的利用count引用类型实现统计所有路径。
附录:源码gitee仓库
考虑到有些算法需要模拟数据,如果全部放进来代码显得过长,不利于聚焦在算法的核心思路上。于是把所有的代码整理到了开源仓库上,如果想要看详细模拟数据,可在开源仓库自取:【凌空暗羽/剑指Offer-C++版手写代码】。
我是【Jerry说前后端】,本系列精心挑选的算法题目均基于经典的《剑指 Offer(数据结构与算法面试题精讲)》。在如今竞争激烈的技术求职环境下,算法能力已成为前端开发岗位笔试考核的关键要点。通过深入钻研这一系列算法题,大家能够系统地积累算法知识和解题经验。每一道题目的分析与解答过程,都像是一把钥匙,为大家打开一扇通往高效编程思维的大门,帮助大家逐步提升自己在数据结构运用、算法设计与优化等方面的能力。
无论是即将踏入职场的应届毕业生,还是想要进一步提升自身技术水平的在职开发者,掌握扎实的算法知识都是提升竞争力的有力武器。希望大家能跟随我的步伐,在这个系列中不断学习、不断进步,为即将到来的前端笔试做好充分准备,顺利拿下心仪的工作机会!快来订阅吧,让我们一起开启这段算法学习之旅!
相关文章:
剑指Offer(数据结构与算法面试题精讲)C++版——day16
剑指Offer(数据结构与算法面试题精讲)C版——day16 题目一:序列化和反序列化二叉树题目二:从根节点到叶节点的路径数字之和题目三:向下的路径节点值之和附录:源码gitee仓库 题目一:序列化和反序…...
windows server C# IIS部署
1、添加IIS功能 windows server 2012、windows server 2016、windows server 2019 说明:自带的是.net 4.5 不需要安装.net 3.5 尽量使用 windows server 2019、2016高版本,低版本会出现需要打补丁的问题 2、打开IIS 3、打开iis应用池 .net 4.5 4、添…...
Android: gradient 使用
在 Android 中使用 gradient(渐变) 通常是通过 drawable 文件来设置背景。下面是可以直接用的几种用法汇总,包括线性渐变、径向渐变、扫描渐变(sweep)等: ✅ 1. Linear Gradient(线性渐变&#…...
【教程】PyTorch多机多卡分布式训练的参数说明 | 附通用启动脚本
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 torchrun 一、什么是 torchrun 二、torchrun 的核心参数讲解 三、torchrun 会自动设置的环境变量 四、torchrun 启动过程举例 机器 A&#…...
Neo4j初解
Neo4j 是目前应用非常广泛的一款高性能的 NoSQL 图数据库,其设计和实现专门用于存储、查询和遍历由节点(实体)、关系(边)以及属性(键值对)构成的图形数据模型。它的核心优势在于能够以一种自然且…...
学习笔记二十——Rust trait
🧩 Rust Trait 彻底搞懂版 👀 目标读者:对 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。 🛠 方法: 先给“心里模型”——用生活类比把抽象概念掰开揉…...
音视频小白系统入门课-2
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 课程传送门:音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1 课程实践代码仓库:传送门 音视频编解…...
Linux:安装 CentOS 7(完整教程)
文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、结语 一、简介 CentOS(Community ENTerprise Operating System)是一个基于 Linux 的发行版之一,旨在提供一个免费的、企业级的计算平台,因其稳定性、安全…...
MATLAB 控制系统设计与仿真 - 34
多变量系统知识回顾 - MIMO system 这一章对深入理解多变量系统以及鲁棒分析至关重要 首先,对于如下系统: 当G(s)为单输入,单输出系统时: 如果: 则: 所以 因此,对于SISO,系统的增…...
【网络】通过Samba实现Window挂在Linux服务器路径
有时候我们去进行内网部署时,会遇到客户或者甲方爸爸说,需要将Linux中的某个路径共享出去到Window上,挂载出比如Z:\这种盘符。通过打开Z盘,来查看服务器的指定目录下的数据。 步骤1: 在Linux中安装samba yum install…...
DevOps 进阶指南:如何让工作流更丝滑?
DevOps 进阶指南:如何让工作流更丝滑? 引言 在 DevOps 世界里,我们追求的是高效、稳定、自动化。但现实总是充满挑战:代码部署失败、CI/CD 过程卡顿、环境不一致……这些痛点让开发和运维团队疲惫不堪。今天,我就来聊聊如何优化 DevOps 工作流,通过实战案例和代码示例,…...
架构思维:缓存层场景实战_读缓存(下)
文章目录 Pre业务场景缓存存储数据的时机与常见问题解决方案1. 缓存读取与存储逻辑2. 高并发下的缓存问题及解决方案3. 缓存预热(减少冷启动问题) 缓存更新策略(双写问题)1. 先更新缓存,再更新数据库(不推荐…...
uniapp微信小程序实现sse
微信小程序实现sse 注:因为微信小程序不支持sse请求,因为后台给的是分包的流,所以我们就使用接受流的方式,一直接受,然后把接受的数据拿取使用。这里还是使用uniapp的原生请求。 上代码 //注意:一定要下…...
C#语言的区块链
C#语言在区块链开发中的应用 引言 区块链技术自比特币问世以来,逐渐发展成为一种革命性的技术,其在金融、供应链、物联网等各个领域都产生了深远的影响。随着区块链应用的不断增加,开发者对区块链技术的需求也在不断上升。在众多编程语言中…...
Ubuntu服务器日志满audit:backlog limit exceeded了会报错解决方案-Linux 审计系统 (auditd) 工具
auditd 是 Linux 系统中的审计守护进程,负责收集、记录和监控系统安全相关事件。以下是相关工具及其功能: 核心组件 auditd - 审计守护进程 系统的审计服务主程序 收集系统调用信息并写入日志文件 通常存储在 /var/log/audit/audit.log auditctl - 审计控…...
新能源汽车能量流测试的传感器融合技术应用指南
第一部分:核心原理模块化拆解 模块1:多源传感器物理层融合 关键技术: 高精度同步采集架构 采用PXIe-8840控制器同步定时模块(NI PXIe-6674T),实现CAN/LIN/模拟量信号的μs级同步光纤电压传感器࿰…...
人工智能与网络安全:AI如何预防、检测和应对网络攻击?
引言:网络安全新战场,AI成关键角色 在数字化浪潮不断推进的今天,网络安全问题已经成为每一家企业、每一个组织无法回避的“隐形战场”。无论是电商平台、金融机构,还是政府机关、制造企业,都可能面临数据泄露、勒索病毒…...
链表知识回顾
类型:单链表,双链表、循环链表 存储:在内存中不是连续存储 删除操作:即让c的指针指向e即可,无需释放d,因为java中又内存回收机制 添加节点: 链表的构造函数 public class ListNode {// 结点…...
FPGA学习(五)——DDS信号发生器设计
FPGA学习(五)——DDS信号发生器设计 目录 FPGA学习(五)——DDS信号发生器设计一、FPGA开发中常用IP核——ROM/RAM/FIFO1、ROM简介2、ROM文件的设置(1)直接编辑法(2)用C语言等软件生成初始化文件 3、ROM IP核配置调用 二、DDS信号发…...
【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值
文章目录 前言一、题目二、解题思路总结 前言 本次训练内容: 栈的复习。栈模拟四则运算计算问题的练习。训练解题思维。 一、题目 从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加()、减…...
OpenCv高阶(六)——图像的透视变换
目录 一、透视变换的定义与作用 二、透视变换的过程 三、OpenCV 中的透视变换函数 1. cv2.getPerspectiveTransform(src, dst) 2. cv2.warpPerspective(src, H, dsize, dstNone, flagscv2.INTER_LINEAR, borderModecv2.BORDER_CONSTANT, borderValue0) 四、文档扫描校正&a…...
性能比拼: Go vs Bun
本内容是对知名性能评测博主 Anton Putra Go (Golang) vs. Bun: Performance (Latency - Throughput - Saturation - Availability) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 我对 Bun 在之前的基准测试中的出色表现感到惊讶,因此我决定将它与 Go …...
定制化 Docsify 文档框架实战分享
🌟 定制化 Docsify 文档框架实战分享 在构建前端文档平台时,我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify,我实现了以下几个方面的定制优化,分享给大家 🙌。 &…...
Qt中读写结构体字节数据
在Qt中读写结构体字节数据通常涉及将结构体转换为字节数组(QByteArray)或直接从内存中读写。以下是几种常见方法: 方法1:使用QDataStream读写结构体 cpp #include <QFile> #include <QDataStream>// 定义结构体 #pragma pack(push, 1) //…...
鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
本文聚焦于ArkUI的布局实战,三种十分重要的布局,线性布局、弹性布局、层叠布局,在实际开发过程中这几种布局方法都十分常见,下面直接上手 线性布局 垂直布局(Column) 官方文档: Column-行列…...
测试基础笔记第七天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、cat命令二、ls -al命令三、>重定向符号四、>>追加重定向符号五、less/more命令六、grep命令七、|管道符八、clear命令九、head命令十、tail命令十一、…...
[Windows] Adobe Camera Raw 17.2 win/Mac版本
[Windows] Adobe Camera Raw 链接:https://pan.xunlei.com/s/VOOIAXoyaZcKAkf_NdP-qw_6A1?pwdpd5k# Adobe Camera Raw,支持Photoshop,lightroom等Adobe系列软件,对相片无损格式进行编辑调色。 支持PS LR 2022 2023 2024 2025版…...
开源模型应用落地-Podcastfy-从文本到声音的智能跃迁-Gradio(一)
一、前言 在当今信息呈现方式越来越多样化的背景下,如何将文字、图片甚至视频高效转化为可听的音频体验,已经成为内容创作者、教育者和研究者们共同关注的重要话题。Podcastfy是一款基于Python的开源工具,它专注于将多种形式的内容智能转换成…...
深入剖析 Java Web 项目序列化:方案选型与最佳实践
在 Java Web 开发中,“序列化”是一个你无法绕过的概念。无论是缓存数据、共享 Session,还是进行远程过程调用(RPC)或消息传递,序列化都扮演着底层数据搬运工的角色。它负责将内存中的 Java 对象转换成可传输或可存储的…...
Python 深度学习实战 第11章 自然语言处理(NLP)实例
Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理(NLP)的深度学习应用,涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务,详细介绍了如何使…...
