剑指Offer(数据结构与算法面试题精讲)C++版——day17
剑指Offer(数据结构与算法面试题精讲)C++版——day17
- 题目一:节点值之和最大的路径
- 题目二:展平二叉搜索树
- 题目三:二叉搜索树的下一个节点
- 附录:源码gitee仓库
题目一:节点值之和最大的路径
题目:在二叉树中将路径定义为顺着节点之间的连接从任意一个节点开始到达任意一个节点所经过的所有节点。路径中至少包含一个节点,不一定经过二叉树的根节点,也不一定经过叶节点。给定非空的一棵二叉树,请求出二叉树所有路径上节点值之和的最大值。例如,在如图8.6所示的二叉树中,从节点15开始经过节点20到达节点7的路径的节点值之和为42,是节点值之和最大的路径。
根据示例可以得到,这里的最大和路径可以从左侧节点绕过父节点再走到右侧。回顾前面剑指Offer(数据结构与算法面试题精讲)C++版——day16中的题目三(向下的路径节点值之和),因为需要遍历从根节点遍历到所有的叶子节点,整体上需要满足一种自上而下的结构,而这里需要的考虑绕过根节点,于是可以想到将前序遍历改成后序遍历,保证这里的路径能够从左到右绕过父节点探索。
但是,这样显然不够,因为如果简单使用后续遍历会发现,15,7这种路径不能够存在,因为没有直接节点相连,并且如果选择了15,20,7这样的路径,那么不能够再选择当前20节点的父节点,因为这种结构存在路径重复,与题意不符。于是想到我们对于一个新节点的遍历,应该考虑如下三种情况:
(1)沿着该节点向左孩子遍历;
(2)沿着该节点向右孩子遍历;
(3)舍弃前面的遍历结果,考虑左孩子->父节点->右节点遍历;
最终得到如下代码:
int maxSum = INT_MIN;
int dfs(treeNode* tree) {if (tree == nullptr){return 0;}int leftMax = max(0, dfs(tree->left));//若左右分支返回的值为负数,则对路径和做负贡献,直接舍弃int rightMax = max(0, dfs(tree->right));int leftAndRight = leftMax + tree->val + rightMax; //可能为left->root->right,使用了后续不可再延伸 maxSum = max(maxSum, leftAndRight);return tree->val + max(leftMax, rightMax);//向node的父结点返回经过node的单边分支的最大路径和
}int maxPathSum(treeNode* tree) { dfs(tree);return maxSum;
}
这道题的代码其实不是很好想,在leetcode上面这是一道hard题,我这里也是看了很多题解介绍才搞明白的。为了方便理解这里将maxSum设置成全局变量,在实际算法题中其实是可行的(如果不太习惯这种写法那其实也可以将maxSum设置成一个引用类型对象,本质上差不多)。在理解时可以先不考虑“左根右”这种遍历方式,整个代码就更方便理解了,一开始分别计算左右子树的和,如果左子树大接下来进入左子树,右子树大进入右子树,因为如果子树更小,那不如直接取另外一边,之所以深度递归下去是为了检测是否还有负数值产生干扰以提前裁剪。这样遍历的整体形式就是自上而下了,为了考虑到“左根右”遍历,再补上这样计算与总和的大小比较取max,这样整个代码就清晰很多了。
题目二:展平二叉搜索树
题目:给定一棵二叉搜索树,请调整节点的指针使每个节点都没有左子节点。调整之后的树看起来像一个链表,但仍然是二叉搜索树。例如,把图8.8(a)中的二叉搜索树按照这个规则展平之后的结果如图8.8(b)所示。
由题意可知这是一种中序遍历方式,只是需要维护节点不能够具有左子树。这里有一种暴力思路,先按照中序遍历的方式遍历这棵二叉搜索树,遍历完将节点值压入到队列中,然后删除节点,之后利用队列中的值重新构建一棵二叉树。但这里还有一种更好的方式,不需要删除树和重建,而是采用栈存储节点,然后再调整指针指向,因为涉及到修改指针指向,所以这里应该使用中序遍历的非递归写法(非递归写法思路见第三题),然后利用临时指针记录前一个指针,实现逆序构建指针指向,最终得到代码如下:
treeNode * flattenTree(treeNode* tree) {treeNode* current=tree,*pre=nullptr,*root=nullptr;stack<treeNode* > st;while(current||!st.empty()) {while(current) {//找到最左边元素st.push(current);current=current->left;}current=st.top();st.pop();if(pre) {//检查节点是否第一个出现,记录根节点并修改指向 pre->right=current;} else {root=current;}pre=current; current->left=nullptr;current=current->right;}return root;
}
题目三:二叉搜索树的下一个节点
题目:给定一棵二叉搜索树和它的一个节点p,请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如,在图8.9的二叉搜索树中,节点8的下一个节点是节点9,节点11的下一个节点是null。
结合前面第二题,这里就比较简单了,同样是利用中序遍历的非递归写法,由于第二题没有详细说明二叉树中序遍历的非递归写法思路,这里刚好补上。我们在中序遍历时,首先需要拿到最左下角元素,然后遍历“根节点”,再来遍历右子树,在右子树中还是需要先找到右子树的最左侧节点,这就是为什么中序遍历的非递归写法中会出现两个while循环。然后对于中间的“根节点”使用栈来维护,因为最左侧的节点先一步出栈,之后是这些中间“根节点”,所以在第二个while中会提前将current节点入栈,如果拿到最后一个比如这里的节点5,其后没有节点了,那么在栈中取节点,这时就回到了中间“根节点”6,之后换入到右子树,按照前面的步骤接着进行。这里你可能想到可能current->right为空,比如这里7节点扫描完成之后,接下来访问的节点就是空节点了,这里就巧妙利用了第一层while的判定条件,只要current为空但栈中有节点那么弹出栈中元素,保证了整个中序遍历的完整性。
treeNode * getNextNode(treeNode* tree,int val) {treeNode* current=tree,*pre=nullptr;stack<treeNode* > st;while(current||!st.empty()) {while(current) {//找到最左边元素st.push(current);current=current->left;}current=st.top();st.pop();if(pre&&pre->val==val) {//取出二叉搜索树的下一个节点return current;}pre=current;current=current->right;}return nullptr;
}
附录:源码gitee仓库
考虑到有些算法需要模拟数据,如果全部放进来代码显得过长,不利于聚焦在算法的核心思路上。于是把所有的代码整理到了开源仓库上,如果想要看详细模拟数据,可在开源仓库自取:【凌空暗羽/剑指Offer-C++版手写代码】。
我是【Jerry说前后端】,本系列精心挑选的算法题目均基于经典的《剑指 Offer(数据结构与算法面试题精讲)》。在如今竞争激烈的技术求职环境下,算法能力已成为前端开发岗位笔试考核的关键要点。通过深入钻研这一系列算法题,大家能够系统地积累算法知识和解题经验。每一道题目的分析与解答过程,都像是一把钥匙,为大家打开一扇通往高效编程思维的大门,帮助大家逐步提升自己在数据结构运用、算法设计与优化等方面的能力。
无论是即将踏入职场的应届毕业生,还是想要进一步提升自身技术水平的在职开发者,掌握扎实的算法知识都是提升竞争力的有力武器。希望大家能跟随我的步伐,在这个系列中不断学习、不断进步,为即将到来的前端笔试做好充分准备,顺利拿下心仪的工作机会!快来订阅吧,让我们一起开启这段算法学习之旅!
相关文章:
剑指Offer(数据结构与算法面试题精讲)C++版——day17
剑指Offer(数据结构与算法面试题精讲)C版——day17 题目一:节点值之和最大的路径题目二:展平二叉搜索树题目三:二叉搜索树的下一个节点附录:源码gitee仓库 题目一:节点值之和最大的路径 题目&am…...
opencv函数展示4
一、形态学操作函数 1.基本形态学操作 (1)cv2.getStructuringElement() (2)cv2.erode() (3)cv2.dilate() 2.高级形态学操作 (1)cv2.morphologyEx() 二、直方图处理函数 1.直方图…...
10天学会嵌入式技术之51单片机-day-3
第九章 独立按键 按键的作用相当于一个开关,按下时接通(或断开),松开后断开(或接通)。实物图、原理图、封装 9.2 需求描述 通过 SW1、SW2、SW3、SW4 四个独立按键分别控制 LED1、LED2、LED3、LED4 的亮…...
DeepSeek智能时空数据分析(二):3秒对话式搞定“等时圈”绘制
序言:时空数据分析很有用,但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要,然而,三大挑战仍制约其发展:技术门槛高,需融合GIS理论、SQL开发与时空数据库等多领域知识;空…...
第 7 篇:总结与展望 - 时间序列学习的下一步
第 7 篇:总结与展望 - 时间序列学习的下一步 (图片来源: Guillaume Hankenne on Pexels) 恭喜你!如果你一路跟随这个系列走到了这里,那么你已经成功地完成了时间序列分析的入门之旅。我们从零开始,一起探索了时间数据的基本概念、…...
计算机视觉中的正则化:从理论到实践的全面解析
🌟 计算机视觉中的正则化:从理论到实践的全面解析🌟 大家好!今天要和大家分享的是在计算机视觉(CV)领域中非常重要的一个概念——正则化(Regularization)。无论你是刚开始接触深度学…...
解决使用hc595驱动LED数码管亮度低的问题
不知道大家在做项目的时候有没有遇到使用hc595驱动LED数码管亮度低的问题(数码管位数较多),如果大佬们有好的方法的可以评论区留言 当时我们解决是换成了天微的驱动芯片,现在还在寻找新的解决办法(主要软件不花钱&…...
Allegro23.1新功能之4K显示器页面显示不全如何解决操作指导
Allegro23.1新功能之4K显示器页面显示不全如何解决操作指导 Allegro升级到了23.1的时候,可能会出现界面显示不全的情况,如下图 是因为4K高清显示器的原因导致的 如何解决,具体操作如下 我的电脑,右键选择属性 点击高级系统设置 …...
C++——STL——容器deque(简单介绍),适配器——stack,queue,priority_queue
目录 1.deque(简单介绍) 1.1 deque介绍: 1.2 deque迭代器底层 1.2.1 那么比如说用迭代器实现元素的遍历,是如何实现的呢? 1.2.2 头插 1.2.3 尾插 1.2.4 实现 编辑 1.2.5 总结 2.stack 2.1 函数介绍 2.2 模…...
网络原理——UDP
1、 与TCP的关键区别 特性UDPTCP连接方式无连接面向连接可靠性不可靠可靠数据顺序不保证顺序保证顺序传输速度更快相对较慢头部开销8字节20-60字节流量控制无有拥塞控制无有适用场景实时应用、广播/多播可靠性要求高的应用 2、UDP 报文结构 报文结构大致可以分为首部和载荷&a…...
下载pycharm遇到的问题及解决方法
下载和安装 PyCharm 时可能会遇到一些具体问题,以下是一些常见问题及其解决方法: 常见问题及解决方法 下载速度慢或下载中断 解决方法: 检查你的互联网连接,并重启路由器。尝试使用不同的网络连接(如使用移动热点&…...
微硕WSP4407A MOS管在智能晾衣架中的应用与市场分析
微硕WSP4407A MOS管在智能晾衣架中的应用与市场分析 一、引言 智能晾衣架作为一种现代化的家居设备,其核心部件之一是驱动电路,而MOS管作为驱动电路中的关键元件,其性能直接影响到智能晾衣架的运行效率和稳定性。微硕半导体推出的WSP4407A …...
Java 性能优化:如何利用 APM 工具提升系统性能?
Java 性能优化:如何利用 APM 工具提升系统性能? 在当今竞争激烈的软件开发领域,系统性能至关重要。随着应用规模的扩大和用户需求的增加,性能问题逐渐凸显,这不仅影响用户体验,还可能导致业务损失。而 APM…...
FPGA 中 XSA、BIT 和 DCP 文件的区别
在 FPGA(现场可编程门阵列)开发中,XSA、BIT 和 DCP 文件是常见的文件类型,它们在功能、用途、文件内容等方面存在明显区别,以下是详细介绍: 1. XSA 文件 定义与功能 XSA(Xilinx Shell Archiv…...
【c语言】指针进阶
目录 1.字符指针 2.指针数组 3.数组指针 3.1 数组指针的定义 3.2 数组指针的使用 4.数组参数,指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5.函数指针 6.函数指针数组 6.1函数指针数组的定义 6.2 函数指针数组…...
使用FastAPI与OpenAI构建多模态分析API服务
引言 随着多模态AI模型的普及(如Qwen-Omni-Turbo),开发者可以轻松构建支持图像、音频、视频分析的API服务。本文将通过一个FastAPI示例,展示如何通过Base64编码传输媒体文件,并结合OpenAI API实现异步分析。这一方案适…...
集成学习实际案例
一、算法竞赛经典:Kaggle & 国际赛事 1. 泰坦尼克号生存预测(Random Forest) 场景:Kaggle 入门级经典赛题,基于乘客信息预测生存概率。方案: 基模型:决策树(CART)&…...
Linux421用户、组
参考...
树模型与集成学习(决策树核心算法:ID3/C4.5/CART、随机森林、GBDT/XGBoost)
树模型与集成学习 一、决策树 决策树核心算法:ID3/C4.5/CART ID3算法(基于信息增益) 核心原理 ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,由Ross Quinlan于1975年提出。其核心思想是通过信…...
Netdata 监控多台服务器
一、多服务器监控方案选择 1. Netdata Cloud(官方推荐,免费) 特点:无需自建中心节点,通过 Netdata 官方云平台集中查看所有服务器。步骤: 在每台服务器上安装 Netdata(参考上一指南࿰…...
CTF web入门之SQL注入使用工具sqlmap
详细说明:https://blog.csdn.net/qq_41701460/article/details/146391515 web201: 查看数据库 获取不到数据库信息 https://9556eca3-d69a-40f4-b2a4-c89c2d2f8f12.challenge.ctf.show/api/?id1题目有提到 使用–user-agent 指定agent,因为对于 sqlm…...
spark–sql项目实验
数据读取与格式转换 读取JSON数据:使用Spark提供的读取接口(如 spark.read.json() ,在不同编程语言接口下使用方式类似)将给定的JSON格式数据读入Spark中,形成 DataFrame 。 格式转换:按照题目要求&…...
gnome中删除application中失效的图标
什么是Application 这一块的东西应该叫application,准确来说应该是applications。 正文 系统级:/usr/share/applications 用户级:~/.local/share/applications ying192 ~/.l/s/applications> ls | grep xampp xampp.desktoprm ~/.local…...
华为设备命令部分精简分类汇总示例
华为网络设备的命令体系庞大且复杂,不同设备系列(如交换机、路由器、防火墙)和不同操作系统版本(如VRP5、VRP8)的命令可能存在差异。以下是一个 精简分类汇总,涵盖常用配置场景和命令示例: 一、…...
Java 自动装箱与拆箱:基本数据类型与包装类的转换
在Java编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的概念。它们使得基本数据类型与其对应的包装类之间的转换更加方便,同时也提高了代码的可读性和可维护性。 什么是自动装箱和拆箱&#…...
论文阅读HARIVO: Harnessing Text-to-Image Models for Video Generation
h-space对比损失(DC)的设计细节 目标:确保视频的所有帧在语义上保持一致(例如,同一视频中的不同帧应描述相同的主体和场景,避免物体突变或语义漂移)。 1. h-space的定义 h-space 是U-Net最深…...
OpenCV基础函数学习4
【大纲笔记见附件pdf】 目录 一、基于OpenCV的形态学操作 二、基于OpenCV的直方图处理 三、基于OpenCV霍夫变换 四、基于OpenCV模板匹配 一、基于OpenCV的形态学操作 二、基于OpenCV的直方图处理 三、基于OpenCV霍夫变换 四、基于OpenCV模板匹配...
大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结
大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署 1. ClickHouse与MySQL的区别2. 在群集的所有机器上安装ClickHouse服务端2.1. 在线安装clickhouse2.2. 离线安装clickhouse 3. ClickHouse Keeper/Zookeeper集群安装4. 在配置文件中设置集群配置5. 在每…...
【leetcode题解】算法练习
目录 分治-快排算法 颜色分类 移动零 排序数组 数组中的第K个最大元素 最小K个数 分治-归并排序 排序数组 交易逆序对的总数(困难) 计算右侧小于当前元素的个数(困难) 翻转对(困难) 字符串 最…...
大模型要被特定行业所用,从难到易有四种方式:重新训练或从头构建模型、微调模型、动态提示(如 RAG 技术)、简单提示工程
大模型在特定行业应用的四种方式详解 根据提供的信息,大模型要被特定行业所用,从难到易有四种方式:重新训练或从头构建模型、微调模型、动态提示(如 RAG 技术)、简单提示工程。以下是每种方式的详细解析及实际案例说明…...
[Python] 入门核心笔记
目录 一、Python简介重点 二、编程语言基础重点 三、Python安装重点 四、第一个Python程序重点 五、Python解释器重点 六、Python开发环境重点 一、Python简介重点 起源:1989年Gudio van Rossum开发,1991年诞生,名字源于电视剧《Monty Python…...
TensorFlow中使用Keras
目录 前言创建模型配置layers训练和评估配置模型训练评估和预测 前言 keras集成在tf.keras中。 创建模型 创建一个简单的模型,使用tf.keras.sequential。 model tf.keras.Sequential() # 创建一层有64个神经元的网络: model.add(layers.Dense(64, activationrelu)) # 添加…...
【Flask】Explore-Flask:早期 Flask 生态的实用指南
开源项目:explore-flask/README.rst at master rpicard/explore-flask (github.com) 一、Coding conventions Summary Try to follow the coding style conventions laid out in PEP 8. Try to document your app with docstrings as defined in PEP 257. def…...
Canvas入门教程!!【前端】
目录 canvas是什么?使用场景:canvas使用:引入:获取2D的上下文:坐标轴: 绘制:beginPath() :moveTo() :lineTo():stroke():fillRect() :strokeStyle 属性&#…...
通过规范化模型自训练增强医学图像分割中的无监督域自适应|文献速递-深度学习医疗AI最新文献
Title 题目 Enhancing source-free domain adaptation in Medical Image Segmentationvia regulated model self-training 通过规范化模型自训练增强医学图像分割中的无监督域自适应 01 文献速递介绍 深度卷积神经网络对训练数据分布(源域)和测试数…...
Linux常见指令介绍中(入门级)
1. man 在Linux中,man命令是用于查看命令手册页的工具,它可以帮助用户了解各种命令、函数、系统调用等的详细使用方法和相关信息。 用法:在终端中输入man加上要查询的命令或工具名称,例如man ls,就会显示ls命令的手册…...
一文详解卷积神经网络中的卷积层和池化层原理 !!
文章目录 前言 一、卷积核大小(Kernel Size) 1. 卷积核大小的作用 2. 常见的卷积核大小 3. 选择卷积核大小的原则 二、步长(Stride) 1. Stride的作用 三、填充(Padding) 1. 填充的作用 四、通道数ÿ…...
神经网络直接逆控制:神经网络与控制的结合入门级结合
目录 1. 前言 2. 什么是直接逆控制? 2.1 直接逆控制的优点 2.2 直接逆控制的局限性 3. 直接逆控制的实现步骤 3.1 数据准备 3.2 神经网络设计 3.3 训练神经网络 3.4 控制实现 4. 使用 PyTorch 实现直接逆控制 4.1 问题描述 4.2 数据生成 4.3 神经网络设…...
使用tabs组件搭建UI框架
本节任务 使用tabs组件搭建ui框架 包含页签:首页、动态、发布,会员购、我的。 涉及内容: Tabs、TabContent组件Builder装饰器属性模型封装,包括:接口、枚举、常量 界面原型 1 Tabs布局 在MainPage(如果…...
jmeter跟踪重定向和自动重定向有什么区别?
在 JMeter 中,跟踪重定向和自动重定向有以下区别: 概念 跟踪重定向:指的是 JMeter 会按照服务器返回的重定向信息,继续发送请求到重定向的目标地址,并记录下整个重定向的过程,包括重定向的地址、响应信息…...
unity3d实现物体闪烁
unity3d实现物体闪烁,代码如下: using UnityEngine;public class Test : MonoBehaviour {//创建一个常量,用来接收时间的变化值private float shake;//通过控制物体的MeshRenderer组件的开关来实现物体闪烁的效果private MeshRenderer BoxColliderClick…...
(三十)安卓开发中的MVP模式详解
在安卓开发中,MVP(Model-View-Presenter) 是一种常见的软件架构模式,它通过将应用程序的逻辑与用户界面分离,使得代码更加模块化、易于维护和测试。本文将详细讲解MVP模式的组成部分、工作流程、优点,并结合…...
独立ADC和MCU中ADC模块的区别
以图中两种方案为例: 使用独立ADC和使用MCU的内部ADC来实现模数转换,有什么性能、技术上的区别吗? 集成和独立芯片各有优劣势: 1、集成的节约了板子空间,减少了外围设计。工艺也不一样,集成的工艺相对高一…...
微软Entra新安全功能引发大规模账户锁定事件
误报触发大规模锁定 多家机构的Windows管理员报告称,微软Entra ID新推出的"MACE"(泄露凭证检测应用)功能在部署过程中产生大量误报,导致用户账户被大规模锁定。这些警报和锁定始于昨夜,部分管理员认为属于误…...
Ray Tracing(光线追踪)与 Ray Casting(光线投射)
Ray Casting(光线投射) 定义:一种从观察点(如摄像机)向场景中每个像素投射单条光线,找到最近可见物体的渲染技术。 核心任务:确定像素对应的物体表面颜色,通常仅计算直接光照&#…...
Shell脚本-变量的分类
在Shell脚本编程中,变量是存储数据的基本单位。它们可以用来保存字符串、数字甚至是命令的输出结果。正确地定义和使用变量能够极大地提高脚本的灵活性与可维护性。本文将详细介绍Shell脚本中变量的不同分类及其应用场景,帮助你编写更高效、简洁的Shell脚…...
go for 闭环问题【踩坑记录】
Go 中的for 循环闭包问题,是每个 Go 程序员几乎都踩过的坑,也是面试和实际开发中非常容易出错和引起 bug 的地方。这里我会通过原理、示例、修正方法、背后机制等角度详细为你讲解。 一、问题描述 当你在 for 循环里写匿名函数(闭包…...
【分布式理论17】分布式调度3:分布式架构-从中央式调度到共享状态调度
文章目录 一、中央式调度器1. 核心思想2. 工作流程3. 优缺点4. **典型案例:Google Borg** 二、两级调度器1. **核心思想**2. **工作流程**3. 优缺点4. **典型案例:Hadoop YARN** 三、共享状态调度器1. **核心思想**2. **工作流程**3. 优缺点4. **典型案例…...
Java高频面试之并发编程-04
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:调用 start()方法时会执行 run()方法,那为什么不直接调用 run()方法? 多线程中调用 start() 方法…...
2025Java面试指南(附答案)
Java全家桶 Java基础 1. Java为什么被称为平台无关性语言? 2. 解释下什么是面向对象?面向对象和面向过程的区别 3. 面向对象的三大特性?分别解释下? 4. Java 中的参数传递时传值呢?还是传引用? 5. JD…...