剑指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(数据结构与算法面试题精讲)》。在如今竞争激烈的技术求职环境下,算法能力已成为前端开发岗位笔试考核的关键要点。通过深入钻研这一系列算法题,大家能够系统地积累算法知识和解题经验。每一道题目的分析与解答过程,都像是一把钥匙,为大家打开一扇通往高效编程思维的大门,帮助大家逐步提升自己在数据结构运用、算法设计与优化等方面的能力。
    无论是即将踏入职场的应届毕业生,还是想要进一步提升自身技术水平的在职开发者,掌握扎实的算法知识都是提升竞争力的有力武器。希望大家能跟随我的步伐,在这个系列中不断学习、不断进步,为即将到来的前端笔试做好充分准备,顺利拿下心仪的工作机会!快来订阅吧,让我们一起开启这段算法学习之旅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)

文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.9&#xff1a;5.2 loc np.where(res > threshold)&#xff1a; 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转…

产品经理学习过程

一&#xff1a;扫盲篇&#xff08;初始产品经理&#xff09; 阶段1&#xff1a;了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二&#xff1a;准备篇 阶段2&#xff1a;工…

【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析

在当今互联网技术飞速发展的时代&#xff0c;分布式系统的架构设计愈发复杂。消息队列作为分布式系统中重要的组件&#xff0c;在解耦应用、异步处理、削峰填谷等方面发挥着关键作用。RocketMQ 作为一款高性能、高可靠的分布式消息中间件&#xff0c;被广泛应用于各类互联网场景…

从“链主”到“全链”:供应链数字化转型的底层逻辑

1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型&#xff0c;是利用新一代数字技术&#xff08;如工业互联网、人工智能、大数据、云计算、边缘计算等&#xff09;对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…

x-ui重新申请ssl证书失败

由于某些需要我们重新申请ssl证书&#xff0c;x-ui自动化脚本不能强制更新&#xff0c;根据x-ui仓库源码&#xff1a; https://github.com/vaxilu/x-ui/blob/main/x-ui.sh 在申请ssl证书的地方稍作修改&#xff0c;得到&#xff0c;运行下面的脚本就可以重新申请ssl证书&#…

Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接

什么是Java NIO&#xff1f; Java NIO&#xff08;New Input/Output&#xff09; 是Java 1.4&#xff08;2002年&#xff09;引入的一种非阻塞、面向缓冲区的输入输出框架&#xff0c;旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO&#xff08;java…

go环境安装mac

下载go安装包&#xff1a;https://golang.google.cn/dl/ 找到对应自己环境的版本下载。 注意有二进制的包&#xff0c;也有图形界面安装的包。图形界面直接傻瓜式点就行了。 二进制的按照下面操作&#xff1a; 1、下载二进制包。 2、将下载的二进制包解压至 /usr/local目录…

LVGL源码(9):学会控件的使用(自定义弹窗)

LVGL版本&#xff1a;8.3 LVGL的控件各式各样&#xff0c;每种控件都有自己的一些特性&#xff0c;当我们想要使用一个LVGL控件时&#xff0c;我们首先可以通过官网去了解控件的一些基本特性&#xff0c;官网链接如下&#xff1a; LVGL Basics — LVGL documentation&#xf…

《软件设计师》复习笔记(1)——考试介绍【新】

目录 一、考试介绍 证书价值 考试要求 二、【新】计算机与软件工程知识 三、软件设计 一、考试介绍 >考试科目>考题形式>考试时长>合格标准计算机与软件工程知识75道单选题&#xff08;每题1分&#xff0c;总分75分&#xff09;2023年11月改革机试后&#…

MCU中的BSS和data都占用SRAM空间吗?

在MCU中&#xff0c;BSS段和data段都占用SRAM空间&#xff0c;但它们的存储方式和用途有所不同。‌ BSS段 BSS段&#xff08;Block Started by Symbol&#xff09;用于存储未初始化的全局变量和静态变量。这些变量在程序启动时会被清零&#xff0c;因此它们不占用Flash空间&a…

Ubuntu 22.04 更换 Nvidia 显卡后启动无法进入桌面问题的解决

原显卡为 R7 240, 更换为 3060Ti 后, 开机进桌面时卡在了黑屏界面, 键盘有反应, 但是无法进入 shell. 解决方案为 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 启动后在开机菜单中(如果没有开机菜单, 需要按shift键), 进入recove…

Python爬虫-爬取猫眼演出数据

前言 本文是该专栏的第53篇,后面会持续分享python爬虫干货知识,记得关注。 猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。 而本文,笔者将以猫眼平台为例,基于Python爬虫…

人工智能-机器学习(线性回归,逻辑回归,聚类)

人工智能概述 人工智能分为:符号学习&#xff0c;机器学习。 机器学习是实现人工智能的一种方法&#xff0c;深度学习是实现机器学习的一种技术。 机器学习&#xff1a;使用算法来解析数据&#xff0c;从中学习&#xff0c;然后对真实世界中是事务进行决策和预测。如垃圾邮件检…

FPGA学习(五)——DDS信号发生器设计

FPGA学习(五)——DDS信号发生器设计 目录 FPGA学习(五)——DDS信号发生器设计一、FPGA开发中常用IP核——ROM/RAM/FIFO1、ROM简介2、ROM文件的设置&#xff08;1&#xff09;直接编辑法&#xff08;2&#xff09;用C语言等软件生成初始化文件 3、ROM IP核配置调用 二、DDS信号发…

【Vue】从 MVC 到 MVVM:前端架构演变与 Vue 的实践之路

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–架构模式的演变背景​三–MVC&#xff1a;经典的分层起点​四–MVP&#xff1a;面向接口的解耦尝试​五–MVVM&#xff1a;数据驱动的终极形态​​六–Vue&#xff1a;MVVM 的现代化实践​​​ 二. 架构模…

【算法】快速排序、归并排序(非递归版)

目录 一、快速排序&#xff08;非递归&#xff09; 1.原理 2.实现 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、归并排序&#xff08;非递归&#xff09; 1.原理 2.实现 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…

CasualLanguage Model和Seq2Seq模型的区别

**问题1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的区别是什么&#xff1f; 因果语言模型(Causal Language Model)&#xff1a; 预测给定文本序列中的下一个字符&#xff0c;一般用于文本生成、补全句子等&#xff0c;模型…

【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景

COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件&#xff0c;专注于 Structure-from…

状态管理最佳实践:Bloc架构实践

状态管理最佳实践&#xff1a;Bloc架构实践 引言 Bloc (Business Logic Component) 是Flutter中一种强大的状态管理解决方案&#xff0c;它基于响应式编程思想&#xff0c;通过分离业务逻辑和UI表现层来实现清晰的代码架构。本文将深入探讨Bloc的核心概念、实现原理和最佳实践…

Python多任务编程:进程全面详解与实战指南

1. 进程基础概念 1.1 什么是进程&#xff1f; 进程(Process)是指正在执行的程序&#xff0c;是程序执行过程中的一次指令、数据集等的集合。简单来说&#xff0c;进程就是程序的一次执行过程&#xff0c;它是一个动态的概念。 想象你打开电脑上的音乐播放器听歌&#xff0c;…