当前位置: 首页 > news >正文

【二叉树算法题记录】二叉树的所有路径,路径总和——回溯

目录

  • 257. 二叉树的所有路径
    • 题目描述
    • 题目分析
    • cpp代码
  • 112. 路径总和
    • 题目描述
    • 题目分析
    • cpp代码

257. 二叉树的所有路径

题目描述

给你一个二叉树的根节点root ,按任意顺序,返回所有从根节点到叶子节点的路径。

题目分析

其实从根节点往下走,遍历的思路就如下图所示。我们先走到叶子节点(这是一条路径),然后再往上回溯,如果回溯到的上层节点有右孩子,那么就再按照右边的路径往下走(另一条路径)。
在这里插入图片描述

  1. 递归传入参数及返回值
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result)

cur是当前节点,path用来记录当前路径,result是最终返回的结果。

  1. 递归终止条件
    当我们遍历到叶子节点时,就要把当前路径path加入result了。
if(cur->left == NULL && cur->right == NULL) {// 如果当前节点是叶子节点,也就是左右孩子都为空// 也就是说已经遍历了一条根节点到叶子节点的路径// 我们要把这条路径放进result中string sPath;for(int i = 0; i < path.size() - 1; i++){sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);result.push_back(sPath);return;}
  1. 单层递归逻辑
    我们进行的是一个前序遍历,但是需要注意的是当前节点的处理要在递归终止条件之前进行:
path.push_back(cur->val);   // 先将当前节点放进当前path中,再判断结束条件

这是因为所有节点包括叶子节点都要加入path,如果先判断终止,再处理当前节点则会漏掉叶子节点。

在进行左右孩子的遍历时,我们要注意判断节点是否为空:

if(cur->left) {traversal(cur->left, path, result);path.pop_back();    // 回溯}if(cur->right) {traversal(cur->right, path, result);path.pop_back();    // 回溯}

cpp代码

/*** 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 traversal(TreeNode* cur, vector<int>& path, vector<string>& result){path.push_back(cur->val);   // 先将当前节点放进当前path中,再判断结束条件if(cur->left == NULL && cur->right == NULL) {// 如果当前节点是叶子节点,也就是左右孩子都为空// 也就是说已经遍历了一条根节点到叶子节点的路径// 我们要把这条路径放进result中string sPath;for(int i = 0; i < path.size() - 1; i++){sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);result.push_back(sPath);return;}if(cur->left) {traversal(cur->left, path, result);path.pop_back();    // 回溯}if(cur->right) {traversal(cur->right, path, result);path.pop_back();    // 回溯}}vector<string> binaryTreePaths(TreeNode* root) {vector<int> path;vector<string> result;if(root == NULL) return result;traversal(root, path, result);return result;}
};

112. 路径总和

题目描述

给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则,返回false

题目分析

其实这题跟上题是一样的,只不过这里多了一个targetSum的判断。

cpp代码

/*** 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 traversal(TreeNode* cur, vector<int>& path, vector<int>& sum){path.push_back(cur->val);if(cur->left == NULL && cur->right == NULL) {cout << "当前路径: ";for(int p : path) {cout << p << ' ';}cout << endl;sum.push_back(accumulate(path.begin(), path.end(), 0));cout << "当前路径总和: " << accumulate(path.begin(), path.end(), 0) << endl;return;}if(cur->left) {traversal(cur->left, path, sum);path.pop_back();}if(cur->right) {traversal(cur->right, path, sum);path.pop_back();}}bool hasPathSum(TreeNode* root, int targetSum) {vector<int> path;vector<int> sum;if(root == NULL) return false;traversal(root, path, sum);if(find(sum.begin(), sum.end(), targetSum) == sum.end()){return false;}else return true;}
};

相关文章:

【二叉树算法题记录】二叉树的所有路径,路径总和——回溯

目录 257. 二叉树的所有路径题目描述题目分析cpp代码 112. 路径总和题目描述题目分析cpp代码 257. 二叉树的所有路径 题目描述 给你一个二叉树的根节点root &#xff0c;按任意顺序&#xff0c;返回所有从根节点到叶子节点的路径。 题目分析 其实从根节点往下走&#xff0c…...

verilog基础语法之数据类型

verilog基础语法之数据类型 1、 wire类型2、 reg类型3、向量 Verilog最常用的数据类型有两种&#xff1a;线网&#xff08;wire&#xff09;和寄存器&#xff08;reg&#xff09;。其中&#xff0c;wire 类型表示硬件单元之间的物理连线&#xff0c;reg用来表示存储单元。 1、…...

ansible部署lamp架构

搭建参考&#xff1a;ansible批量运维管理-CSDN博客 定义ansible主机清单 [rootansible-server ~]# vim /etc/hosts 192.168.200.129 host01 192.168.200.130 host02 [rootansible-server ~]# vim /etc/ansible/hosts [webserver] host01 host02 在ansible端编写index.html…...

Java面试——MyBatis

优质博文&#xff1a;IT-BLOG-CN 一、MyBatis 与 JDBC 的区别 【1】JDBC 是 Java 提供操作数据库的 API&#xff1b;MyBatis 是一个持久层 ORM 框架&#xff0c;底层是对 JDBC 的封装。 【2】使用 JDBC 需要连接数据库&#xff0c;注册驱动和数据库信息工作量大&#xff0c;每…...

Ubuntu-22.04使用systemd.mount挂载本地磁盘

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、systemd.mount是什么&#xff1f;二、使用步骤1.增加mount文件2.测试mount文件 三、补充说明总结 前言 挂载磁盘方式我们都知道很多人喜欢在/etc/fstab里面…...

【Qt】界面定制艺术:光标(cursor)、字体(font)、提示(toolTip)、焦点(focusPolicy)与样式表(styleSheet)的深度探索

文章目录 前言&#xff1a;1. cursor: 设置按钮的光标2. front&#xff1a;设置字体3. toolTip: 鼠标悬停提示4. focusPolicy&#xff1a;设置控件获取到焦点的策略5. styleSheet : 样式表总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;用户界面(UI)的设计和…...

Python GraphQL服务器实现库之tartiflette使用详解

概要 Tartiflette是一个为Python编写的GraphQL服务器实现,它建立在现代异步编程库如asyncio之上,提供了高性能的GraphQL执行环境。Tartiflette专注于提供最佳的开发者体验,支持最新的GraphQL特性。 安装 安装Tartiflette相对简单,但需要依赖于一些系统级的库。 首先,需…...

面试官:请介绍类加载过程,什么是双亲委派模型?

&#x1f680;类加载过程是指在 Java 程序运行时&#xff0c;将类的字节码文件加载到内存中并转换为 Class 对象的过程。Java 类加载器负责加载类&#xff0c;其主要任务是在运行时查找和装载类文件&#xff0c;以生成对应的 Class 对象。 Java的类加载过程一般可以分为以下几个…...

mysql 细分

索引选择性 索引列的唯一值数量 / 表中的总行数 mysql如何优化-CSDN博客 批量问题 批处理默认是逐条发送 SQL 到数据库的&#xff0c;没有充分利用数据库提供的原生批处理能力&#xff0c;需要额外的配置来启用真正的批处理支持&#xff0c;如使用ExecutorType.BATCH 自定…...

数据驱动实战二

目标 掌握数据驱动的开发流程掌握如何读取JSON数据文件巩固PO模式 1. 案例 对TPshop网站的登录模块进行单元测试 1.1 实现步骤 编写测试用例采用PO模式的分层思想对页面进行封装编写测试脚本定义数据文件&#xff0c;实现参数化 1.2 用例设计 1.3 数据文件 {"login…...

解决参考文献自动生成标号,换行时自动缩进

问题如下图所示&#xff0c;红色方框部分应该填充内容&#xff0c;但自动生成标号时不会填充&#xff1a; 解决方案&#xff1a; 1. 选中内容&#xff1a; 2. 找到布局-段落&#xff1a; 3. 选择“无”&#xff0c;即可。...

网络安全专业岗位详解+自学学习路线图

很多网安专业同学一到毕业就开始迷茫&#xff0c;不知道自己能去做哪些行业&#xff1f;其实网络安全岗位还是蛮多的&#xff0c;下面我会介绍一些网络安全岗位&#xff0c;大家可以根据自身能力与喜好决定放哪个方向发展。 渗透测试/Web安全工程师 主要是模拟黑客攻击&#…...

mybatisPlus一个事务中切换数据源概述

概述 在多数据源的配置下&#xff0c;业务中经常遇到在一个被本地事务包裹的save/edi方法中需要查询另一个数据源的数据&#xff1b; 直接查询会提示table不存在&#xff0c;这是因为一个事务和一个mysql连接是绑定的&#xff0c;mysql的连接背后包含了数据库信息&#xff0c;…...

如何在Android手机上恢复已删除的视频?

有时&#xff0c;由于不同的原因&#xff0c;可能会发生意外的数据丢失灾难。 那么如何在Android手机内存或没有计算机的情况下恢复已删除的视频呢&#xff1f;本文将给你一个答案。 如何在Android上恢复已删除的视频&#xff1f; 不要惊慌&#xff01;您可以在Android手机上恢…...

【项目实战】使用Github pages、Hexo如何10分钟内快速生成个人博客网站

文章目录 一.准备工作1.安装git2.安装node安装 cnpm 3.使用 GitHub 创建仓库&#xff0c;并配置 GitHub Pages0.Github Pages是什么1. 在 GitHub 上创建一个新仓库2. 创建您的静态网站3. 启用 GitHub Pages4. 等待构建完成5. 访问您的网站 二. Hexo1.什么是Hexo2.安装Hexo1. 安…...

大数据中服役新数据节点和退役旧节点步骤(hive,hadoop)

1- 节点上线操作 当要新上线数据节点的时候 &#xff0c;需要把数据节点的名字追加在 dfs.hosts &#xff08;1&#xff09;关闭新增节点的防火墙 &#xff08;2&#xff09;在 NameNode 节点的 hosts 文件中加入新增数据节点的 hostname &#xff08;3&#xff09;在每个新…...

数论:不定方程的引入

研究的对象&#xff1a;不定方程 文章目录 研究的对象&#xff1a;不定方程不定方程引入&#xff1a;裴蜀定理证明&#xff1a;欧几里得算法证明&#xff1a;充分性证明&#xff1a;必要性证明&#xff1a; 战术总结&#xff1a; 不定方程引入&#xff1a; 不定方程&#xff0…...

数据中心法

数据中心法是实现词法分析器的结构化方法。通过设计主表和子表分开存储状态转移信息&#xff0c;实现词法分析器的控制逻辑和数据结构分离。 主要解决了状态爆炸、难以维护和复杂性的问题。 状态爆炸是指当状态和转移较多时&#xff0c;单一使用一个表来存储所有的信息的话会导…...

pdffactory pro8.0虚拟打印机(附注册码)

PdfFactory pro是一款非常受欢迎的PDF虚拟打印机&#xff0c;可以帮助用户将你的其他文档保存为PDF格式。请为用户提供打印/发送/加密等多种实用功能&#xff0c;以及一套完善的PDF打印方案。 使用说明 下载pdfFactory Pro压缩包&#xff0c;解压后&#xff0c;双击exe文件&am…...

处理用户输入

目录 一、传递参数 1.1 读取参数 1.2 读取脚本名 二、跟踪参数 三、移动参数 四、处理选项 4.1 查找选项 4.1.1 处理简单选项 4.1.2 分离参数和选项 4.1.3 处理含值的选项 五、选项标准化 5.1 使用 getopt 命令 5.1.1 命令格式 5.1.2 在脚本中使用getopt 5.2 使用…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...