二叉树与图(C++刷题笔记)
二叉树与图(C++刷题笔记)
113. 路径总和 II
力扣
-
从根节点深度遍历二叉树,先序遍历时,将节点存储至path栈中,使用path_val累加节点值
-
当遍历到叶子节点,检查path_val是否为sum,若是,则将pathpush进入res的结果中去
-
在后续变量,将该节点从path栈中弹出,path_val减去节点值
题目代码
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {
public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<vector<int> >res;vector<int>path;int path_val=0;preorder(root,path_val,targetSum,path,res);return res;}void preorder(TreeNode *nd,int &path_val,int sum,vector<int>&path,vector<vector<int> >&res){if(!nd)return;path_val+=nd->val;path.push_back(nd->val);if(!nd->right&&!nd->left&&path_val==sum){res.push_back(path);}preorder(nd->left,path_val,sum,path,res);preorder(nd->right,path_val,sum,path,res);path_val-=nd->val;path.pop_back();}};
236. 二叉树的最近公共祖先
力扣
-
两个节点公共祖先一定从根节点,至这两个节点的路径上
-
由于求公共祖先中的最近公共祖先,那么即同时出现在这两条路径上的里根几点最远的节点
-
求两个节点路径最后一个相同的节点
求根节点到某一个节点的路径
-
从根节点遍历至该节点,找到节点后就结束搜索
-
将遍历过程中遇到的节点按顺序存储,节点即路径
void dfs(TreeNode *nd,TreeNode *search,vector<TreeNode *>&path,vector<TreeNode *>&res,int &end){if(!nd||end==1)return;path.push_back(nd);if(nd==search){end=1;res=path;}dfs(nd->left,search,path,res,end);dfs(nd->right,search,path,res,end);path.pop_back();}
求两路径下最后一个相同节点
-
求出较短路径长度n
-
同时遍历p节点与q节点路径,遍历n个节点,最后一个相同的节点即最近公共祖先
题目代码
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {vector<TreeNode *>path;vector<TreeNode *>p_path;vector<TreeNode *>q_path;int end=0;dfs(root,p,path,p_path,end);path.clear();end=0;dfs(root,q,path,q_path,end);int path_len=0;if(p_path.size()<q_path.size()){path_len=p_path.size();} else{path_len=q_path.size();}TreeNode *res=NULL;for (int i = 0; i < path_len; ++i) {if(p_path[i]==q_path[i]){res=p_path[i];}}return res;}void dfs(TreeNode *nd,TreeNode *search,vector<TreeNode *>&path,vector<TreeNode *>&res,int &end){if(!nd||end==1)return;path.push_back(nd);if(nd==search){end=1;res=path;}dfs(nd->left,search,path,res,end);dfs(nd->right,search,path,res,end);path.pop_back();}
};
114. 二叉树展开为链表
力扣
- 前序遍历二叉树,将指针push进入vector,顺序遍历vector中节点,链接相邻两节点
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void flatten(TreeNode* root) {vector<TreeNode *>vec;preorder(root,vec);for (int i = 1; i <vec.size(); ++i) {vec[i-1]->left=NULL;vec[i-1]->right=vec[i];}}void preorder(TreeNode *nd,vector<TreeNode *>&vec){if(!nd)return;vec.push_back(nd);preorder(nd->left,vec);preorder(nd->right,vec);}
};
199. 二叉树的右视图
-
从二叉树的右侧观察它,将观察到的节点从上到下顺序输出,就是求层次遍历二叉树,每层中最后一个节点
-
层序遍历时,将节点与层数绑定为pair,压入队列时,将节点与层数同时压入队列,并记录每一层出现的最后一个节点
-
层序遍历中,每一层的最后一个节点最后遍历到,随时更新对每层的最后一个节点即可
题目代码
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int>view;queue<pair<TreeNode *,int> >Q;if(root){Q.push(make_pair(root,0));}while (!Q.empty()){TreeNode *nd=Q.front().first;int layer=Q.front().second;Q.pop();if(view.size()==layer){view.push_back(nd->val);} else{view[layer]=nd->val;}if(nd->left){Q.push(make_pair(nd->left,layer+1));}if(nd->right){Q.push(make_pair(nd->right,layer+1));}}return view;}
};
207. 课程表
力扣
-
n个课程m个依赖关系,看成顶点个数为n,边个数为m的有向图
-
若为有向无环图,则可以完成课程
-
否则不能
判断图是否有环
- 深度优先遍历,如果正在遍历某一顶点(还未退出该顶点),又回到了该顶点,证明图有环
题目代码
struct node{int label;vector<node *>neighbors;//邻接表node(int x):label(x){};
};
class Solution {
public://0 正在访问 -1没有访问 1访问过bool dfs(node *nd,vector<int>&vis){vis[nd->label]=0;for (int i = 0; i <nd->neighbors.size() ; ++i) {if(vis[nd->neighbors[i]->label]==-1){if(dfs(nd->neighbors[i],vis)==0){return false;}}else if(vis[nd->neighbors[i]->label]==0){return false;}}vis[nd->label]=1;return true;}bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<node*>graph;vector<int>vis;for (int i = 0; i < numCourses; ++i){graph.push_back(new node(i));vis.push_back(-1);}for (int i = 0; i < prerequisites.size(); ++i){node *begin=graph[prerequisites[i][1]];node *end=graph[prerequisites[i][0]];begin->neighbors.push_back(end);}for (int i = 0; i < graph.size(); ++i){if(vis[i]==-1&&!dfs(graph[i],vis)){return false;}}return true;}
};
拓扑排序
宽度优先搜索,将入度为0的点添加至队列,完成一个顶点的搜索时,把它指向的所有顶点的入度都减一,若此时莫顶点入读为0则添加队列,完成宽度优先搜索后,所有点入度为0,则图无环,否则有环
题目代码
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>> &prerequisites) {vector<int> in;vector<vector<int> > graph;for (int i = 0; i < numCourses; ++i) {graph.push_back(vector<int>());in.push_back(0);}for (int i = 0; i < prerequisites.size(); ++i) {int end = prerequisites[i][0];int start = prerequisites[i][1];graph[start].push_back(end);in[end]++;}queue<int> Q;for (int i = 0; i < in.size(); ++i) {if (in[i] == 0) {Q.push(i);}}while (!Q.empty()) {int node = Q.front();Q.pop();for (int i = 0; i < graph[node].size(); ++i) {in[graph[node][i]]--;if (in[graph[node][i]] == 0) {Q.push(graph[node][i]);}}}for (int i = 0; i < in.size(); ++i) {if (in[i]) {return false;}}return true;}
};
相关文章:
二叉树与图(C++刷题笔记)
二叉树与图(C刷题笔记) 113. 路径总和 II 力扣 从根节点深度遍历二叉树,先序遍历时,将节点存储至path栈中,使用path_val累加节点值 当遍历到叶子节点,检查path_val是否为sum,若是,…...
STM32-ADC多通道输入实验
之前已经介绍了几个ADC的笔记和实验了,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 STM32-单通道ADC采集(DMA读取)实验_Mr_rustylake的博客-CSDN博客 接下来…...
javaIO流之文件流
目录 简介一、File的构造方法二、File的常用方法1、获取功能的方法2、绝对路径和相对路径3、判断功能的方法4、创建、删除功能的方法5、目录的遍历6、递归遍历 三、RandomAccessFile1、主要方法 四、Apache FileUtils 类1、复制文件或目录:2、删除文件或目录&#x…...
DMA-STM32
DMA-STM32 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源 12个独立可配置的通道:DMA1 (7个通道),DMA2 (5个通道) 每个通道都支持软件触发和特定的硬件触发 STM32…...
代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串
目录 39. 组合总和 40.组合总和II 131.分割回文串 39. 组合总和 本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制 题目链接/文章讲解:代码随想录 视频讲解:带你学透回溯算法-组合总和(对应…...
泛型(Generic) <? extends T>,<? super T>
通配符边界引入背景 使用泛型的过程中,经常出现一种很别扭的情况。我们有 Fruit 类,和它的派生类 Apple 类。 class Fruit {}class Apple extends Fruit {}然后有一个最简单的容器:Plate 类。盘子里可以放一个泛型的 “东西”. class Plat…...
数云融合|数字化转型中的利器:揭秘云技术的重要角色
数字化转型不仅是一个流行语,而是一项真正能够改变你的业务流程并提高客户参与度的重要战略。要实现数字化转型,必须重新构建业务流程,同时利用AI、物联网、AR、ML、大数据分析等先进技术不断提升客户参与度。这就需要利用云技术提供的强大计…...
Linux篇2
Linux 0. 终端提示信息1. 文件目录结构1.1 文件目录 2. 文本编辑器VI/VIM2.1 VIM编辑器2.1 一般模式2.2 编辑模式2.3 命令模式 3. 网络配置3.1 VMware提供的三种网络连接模式3.2 静态配置网络IP地址3.3 配置主机名3.3.1 修改主机名3.3.2 配置主机名-IP地址映射关系:…...
《微服务实战》 第九章 Gitlab使用
前言 微服务项目,常常需要多人协作完成工作,本章教程是介绍Gitlab使用,使多人协作告别低端的手动拷贝,也告别传统的SVN。 1、下载安装git https://git-scm.com/download/win 1.1、安装好以后,cmd中输入git 2、生成ssh-key ssh-keygen -t rsa -C “zhangsan@163.com”…...
KMP匹配算法
目录 一、暴力匹配法动画演示代码实现 二、KMP算法的概念三、KMP算法的应用题目代码实现 一、暴力匹配法 动画演示 时间复杂度为: O ( m ∗ n ) O(m * n) O(m∗n) 代码实现 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;int…...
ClickHouse笔记: Ubuntu/Centos下的安装, 配置和用户管理
ClickHouse ClickHouse 属于 OLAP 数据库 OLTP 与 OLAP OLTP (On-Line Transaction Processing 联机事务处理), 注重事务处理, 数据记录的性能和安全性OLAP (On-Line Analytical Processing 联机分析处理), 注重数据分析, 重点在查询的性能 一般使用 OLTP 数据库做业务数据…...
网络编程——UDP编程
UDP编程 UDP编程步骤通信流程serverclient 函数接口socketbindrecvfromsendto 举例UDP客户端UDP服务器 UDP编程步骤 在C语言中进行UDP编程的一般步骤如下: (1)包含头文件: 在代码中包含必要的头文件,以便使用UDP编程所…...
linux内核篇-进程及其调度
介绍一个程序从源文件到进程执行的过程 1、编译链接(源文件到二进制文件) Linux 下面二进制的程序也要有严格的格式,称为ELF(Executeable and Linkable Format,可执行与可链接格式) ,这个格式可…...
C#开发的OpenRA游戏之基地工程车执行部署命令
C#开发的OpenRA游戏之基地工程车执行部署命令 前面已经分析接收到网络命令后,可以拿到多个命令对象, 通过命令对象进行遍历,最终会在比较部署命令的类里相同,从而执行部署命令。 可见,网络游戏里的对象操作,都是通过网络发送给服务器,再从服务器返回消息来执行对象的动…...
米哈游的春招实习面经,问的很基础
米哈游的春招实习面经,主要考察了java操作系统mysql网络,这四个方面。 面试流程,共1小时,1min自我介绍,20min写题,剩下问题基础知识。 Java String,StringBuilder, StringBuffer区…...
pro如何添加定时任务
Pro v2.4版本开始后台可以开关控制定时任务,那如何添加新的定时任务呢? 第一步:设置定时任务名称及标识; 文件app\controller\admin\v1\system\SystemTimer中task_name()方法 /**定时任务名称及标识 * return mixed */ public fu…...
bgp路由策略
* - valid 有效的, > - best 最佳的 上图中,有*和>,是有效最佳的。而没有*和没有>,是无效的,下一跳不可达 1--64511是公有AS 64512-65534为私有AS //属于哪个大的联盟 AS200 //连着一个子类AS 65002 //和子…...
chatGPT4.0编写性能测试报告
性能测试报告 测试概述 本次性能测试的目的是评估系统在高负载条件下的性能表现,以确保系统能够满足预期的性能需求。测试过程中,我们关注以下性能指标:响应时间、吞吐量、资源利用率(CPU、内存、磁盘、网络)以及错误…...
jpa多线程事务
百度都百度不到jpa多线程的事务回滚,废话少说,就是干, 实现思路(可看可不看,本人也不喜欢罗里吧嗦的,想直接看干货就跳过这里,直接执行代码): jpa本身是不支持多线程事务…...
加密解密软件VMProtect教程(四):准备项目之SDK功能
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 SDK 功能可以集成到受保护应用程序的源代码中,以设置受保护区域的边界,以检测调…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
