DFS与回溯专题:路径总和问题

    DFS与回溯专题:路径总和问题

一、路径总和

题目链接: 112.路径总和

题目描述

在这里插入图片描述

代码思路

对二叉树进行dfs搜索,递归计算每条路径的节点值之和,当某个节点的左右子节点都为空时,说明已经搜索完成某一条路径,将它与目标值进行比较,若相等,则为true。

代码纯享版

class Solution {public int judge = 0;public boolean hasPathSum(TreeNode root, int targetSum) {int sum = 0;dfs(root, targetSum, sum);return judge == 1;}void dfs(TreeNode root, int targetSum, int sum){if(root == null) return;sum += root.val;if(root.left == null && root.right == null){if(sum == targetSum) judge = 1;return;}dfs(root.left, targetSum, sum);dfs(root.right, targetSum, sum);}
}

代码逐行解析版

class Solution {public int judge = 0; //用于判断是否存在符合题目要求的路径public boolean hasPathSum(TreeNode root, int targetSum) {int sum = 0; //用来统计路径上的节点值dfs(root, targetSum, sum); //对二叉树进行dfs搜索return judge == 1; //如果judge等于1,返回true;否则返回false}void dfs(TreeNode root, int targetSum, int sum){if(root == null) return; //节点为空,直接返回sum += root.val; //将该节点的值加入sum中if(root.left == null && root.right == null){ //该节点的左右子节点都为空时,说明搜索到了一条完整的路径if(sum == targetSum) judge = 1; //如果sum与目标和相等,judge变成1return;}//到这一步说明路径还没搜索完,接下来搜索该节点的左右子节点dfs(root.left, targetSum, sum);dfs(root.right, targetSum, sum);}
}

代码有关问题的解释

统计时sum的数值为什么不需要进行清零之类的操作?
递归是「隐式」回溯:使用一个整型变量(比如sum)来累加路径上的节点值,则在递归的过程中就不需要显式地进行撤回操作了。这是因为每次递归调用时,sum的值是通过参数传递的,每一层的递归调用都有自己的sum副本,这些副本互不影响。

二、路径总和 II

题目链接: 113.路径总和 II

题目描述

在这里插入图片描述

代码思路

算法流程:
函数 pathSum(root, targetSum) :

初始化: 结果列表 list_all ,路径列表 list 。
返回值: 返回 list_all 即可。
函数 dfs(root, targeSum,sum):

递推参数: 当前节点 root ,当前目标值 sum == targetSum 。
终止条件: 若节点 root 为空,则直接返回。
递推工作:
路径更新: 将当前节点值 root.val 加入路径 list 。
目标值更新: sum += root.val
路径记录: 当 root 为叶节点 且 路径和sum等于目标值 ,则将此路径 list 加入 list_all 。
先序遍历: 递归左 / 右子节点。
路径恢复: 向上回溯前,需要将当前节点从路径 list 中删除,即执行list.remove(list.size() - 1) 。

#代码纯享版

class Solution {public List<List<Integer>> list_all = new ArrayList();public List<Integer> list = new  ArrayList();public List<List<Integer>> pathSum(TreeNode root, int targetSum) {int sum = 0;dfs(root, targetSum, sum);return list_all;}void dfs(TreeNode root, int targetSum, int sum){if(root == null){return;}sum += root.val;list.add(root.val);if(root.left == null && root.right == null && sum == targetSum){list_all.add(new ArrayList(list)); }dfs(root.left, targetSum, sum);dfs(root.right, targetSum, sum);list.remove(list.size() - 1);}
}

代码逐行解析版

class Solution {public List<List<Integer>> list_all = new ArrayList(); //记录所有符合条件的路径public List<Integer> list = new  ArrayList(); //记录搜索过程中的路径public List<List<Integer>> pathSum(TreeNode root, int targetSum) {int sum = 0; //用来统计路径上的节点值dfs(root, targetSum, sum); //对二叉树进行dfs搜索return list_all; //返回路径的列表}void dfs(TreeNode root, int targetSum, int sum){if(root == null){ //节点为空,直接返回return;}sum += root.val; //将该节点的值加入sum中list.add(root.val); //将节点添加到路径中if(root.left == null && root.right == null && sum == targetSum){ //如果路径走完且与目标值相同list_all.add(new ArrayList(list)); //将路径添加到list_all(浅拷贝)}//到这一步说明路径还没搜索完,接下来搜索该节点的左右子节点dfs(root.left, targetSum, sum);dfs(root.right, targetSum, sum);//删掉路径列表中最后一个节点list.remove(list.size() - 1);}
}

代码相关问题的解释

为什么要写list_all.add(new ArrayList(list)),而不是list_all.add(list)?
注意:解释里面的sum.add(path)就是list_all.add(list)
在这里插入图片描述

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

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

相关文章

牛客NC195 二叉树的直径【simple DFS C++ / Java /Go/ PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/15f977cedc5a4ffa8f03a3433d18650d 思路 最长路径有两种情况&#xff1a; 1.最长条路径经过根节点&#xff0c;那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。 2.最长路径没有经过根节点&#xf…

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

Vue3的监听属性watch和计算属性computed

监听属性watch 计算属性computed 一、监听属性watch watch 的第一个参数可以是不同形式的“数据源&#xff0c;watch 可以监听以下几种数据&#xff1a; 一个 ref (包括计算属性)、 一个响应式对象、 一个 getter 函数、 或多个数据源组成的数组 watch 的参数:监视的回调&…

企业数字化转型

企业数字化更多是业务数字化&#xff0c;是“信息化”的更新升级&#xff0c;和信息化有较大差别。 企业信息化专注于企业信息的记录&#xff0c;“无纸化办公”是其明显特征。企业信息化不改造业务&#xff0c;只是业务的计算机方式实现&#xff0c;不对企业内部流程或组织做…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序等等&#xff0c;对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中…

C#:用 BigInteger 计算 斐波那契数列

using System.Numerics; 计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;不受长整型位数限制。 编写 fibonacci.cs 如下 // C# program for Fibonacci Series // using Dynamic Programming using System; using System.Numerics;class fibona…

【C++语言】字符串String练习题

题目连接&#xff1a; 仅仅反转字母 1.仅仅反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s …

Linux学习(补充部分)

关键字 goto关键字 goto 是一个在编程语言中用于控制流的关键字,它允许程序跳转到代码中的标记处。尽管在一些编程规范中被视为不良实践,但在某些情况下,goto 仍然可以是一种有用的工具。 在 C、C++、Python、以及一些其他编程语言中,goto 的基本语法如下: goto label;…

STM32单片机C语言模块化编程实战:按键控制LED灯并串口打印详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 虽然这里演示的是STM32F407&#xff0c;但是ST…

INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN

联表查询是指在数据库中同时查询多个表&#xff0c;并通过它们之间的关联条件将结果合并在一起。这通常通过 SQL 中的 JOIN 操作来实现。常见的 JOIN 类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。 让我们通过一个示例来说明联表查询的基本用法。假设有两个表&a…

ros的master和apollo的cyber的异同

1、前言 ROS (Robot Operating System) 和 Apollo Cyber RT 是两种不同的机器人操作系统框架&#xff0c;各自设计以满足不同场景下尤其是自动驾驶领域的特定需求。虽然它们在设计理念和核心功能上有相似之处&#xff0c;如提供节点&#xff08;Nodes&#xff09;、消息传递机…

书生·浦语大模型第二期实战营第三节-茴香豆:搭建你的 RAG 智能助理 笔记和作业

来源&#xff1a; 视频教程&#xff1a;茴香豆&#xff1a;搭建你的 RAG 智能助理 文字教程&#xff1a;茴香豆&#xff1a;搭建你的 RAG 智能助理 作业来源&#xff1a;第三课作业 茴香豆web链接&#xff1a;茴香豆web-零编程接入飞书微信&#xff08;更新了高精度 LLM&am…

使用R语言生成频数分布表

概要 使用R语言生成频数分布表 在R语言中&#xff0c;可以使用freq()函数来生成频数分布表。首先&#xff0c;将需要分组的数据存储在一个向量中。然后&#xff0c;使用freq()函数将这个向量作为参数输入&#xff0c;即可生成频数分布表。以下是一个示例&#xff1a; 示例 …

代码随想录算法训练营day7 | 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

454.四数相加II 有下面几种思路&#xff1a; 暴力解法&#xff0c;四重循环一个哈希表三重循环两重循环生成一个哈希表两重循环 使用两重循环&#xff1a; class Solution:def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]…

内插和抽取

抽取&#xff1a; 频域表达式的关系&#xff1a; 1、角频率扩大M倍 2、移动2pi、22pi…&#xff08;n-1&#xff09; 2pi 3、相加 4、幅度变为1/M 内插&#xff1a; 加入低通滤波&#xff0c;减小混叠&#xff0c;但是由于截短&#xff0c;也会造成误差&#xff0c;但是…

setTimeout运行机制

当调用 setTimeout 函数时&#xff0c;它用于安排在一定延迟后执行的代码块。它的运行机制如下&#xff1a; 调度任务&#xff1a; 当调用 setTimeout 时&#xff0c;JavaScript 引擎会创建一个定时器&#xff0c;并将指定的代码块&#xff08;回调函数&#xff09;添加到一个称…

贪吃蛇完整代码

贪吃蛇代码 Snake.h //Snake.h #include<windows.h> #include<stdbool.h> #include<stdlib.h> #include<stdio.h> #include<time.h>#define POS_X 24 #define POS_Y 5#define WALL L□ #define BODY L● #define FOOD L★ //类型的声明 // //…

linux复习提纲

后台运行 &&#xff1a;命令行尾输入&#xff0c;命令执行后台运行fg % 作业号&#xff1a;作业前台执行bg % 作业号&#xff1a;作业后台执行 用户权限 主user&#xff08;u&#xff09;-同一组的&#xff08;g&#xff09;-其他&#xff08;o&#xff09; rwx&#xf…

【YOLOv8改进[检测头Head]】YOLOv8的“新头”之动态头(DynamicHead)

目录 一 DynamicHead 二 YOLOv8的“新头”之动态头 1 总体修改 2 配置文件 3 训练 其他 一 DynamicHead 官方论文地址&#xff1a;https://arxiv.org/pdf/2106.08322.pdf 官方代码地址&#xff1a;GitCode - 开发者的代码家园 在计算机视觉应用中&#xff0c;目标检测…

软件著作权登记材料

1、计算机软件著作权登记申请表 2、申请者身份证明 (1)著作权人为企业法人的&#xff1a; 提交有效的企业法人营业执照或事业单位法人证书副本复印件&#xff0c;并需加盖单位公章; (2)著作权人为自然人的&#xff1a; ?提交有效的自然人身份证复印件(正反面复印)。提交《非职…