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

news2024/9/23 0:41:50

    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变成1
            return;
        }

        //到这一步说明路径还没搜索完,接下来搜索该节点的左右子节点
        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.coloradmin.cn/o/1616667.html

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

相关文章

flutter 设置启屏页 flutter_native_splash 坑记录

flutter_native_splash | Flutter packageCustomize Flutters default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.https://pub.dev/packages/flutter_native_splash 发现一直白屏 原因是 代码中 下面…

Hadoop实战——MapReduce-字符统计(超详细教学,算法分析)

目录 一、前提准备工作 启动hadoop集群 二、实验过程 1.虚拟机安装先设置端口转发 2.上传对应文件 3.编写Java应用程序 4. 编译打包程序 5. 运行程序 三、算法设计和分析 算法设计 算法分析 四、实验总结 实验目的&#xff1a;给定一份英文文本&#xff0c;统计每个…

图搜索算法详解:广度优先搜索与深度优先搜索的探索之旅

图搜索算法详解&#xff1a;广度优先搜索与深度优先搜索的探索之旅 1. 广度优先搜索&#xff08;BFS&#xff09;1.1 伪代码1.2 C语言实现 2. 深度优先搜索&#xff08;DFS&#xff09;2.1 伪代码2.2 C语言实现 3. 总结 图搜索算法是计算机科学中用于在图结构中查找路径的算法。…

【电控笔记5.4】pwm延迟

PWM延迟 1标准采样法 Td=MCU计算延迟+输出延迟 Tcon=电流控制周期 Ts=PWM载波周期 Td=1.5Ts(6.3节 ) 电流环跟PWM采样周期同步 2修改采样法

SCSS的基本使用(一)

目录 一、使用&符号来引用父选择器 二、scss的语法 三、变量&#xff08;Variables&#xff09; 四、嵌套&#xff08;Nesting&#xff09; 五、mixin 和 include 六、extend 继承 七、import 与 Partials 八、if简单判断 九、if复杂判断 一、使用&符号来引用父…

部署Devika - 代理 AI 软件工程师

Devika 是一位高级 AI 软件工程师&#xff0c;可以理解高级人类指令&#xff0c;将它们分解为步骤&#xff0c;研究相关信息&#xff0c;并编写代码以实现给定的目标。Devika 利用大型语言模型、规划和推理算法以及 Web 浏览能力来智能开发软件。 Devika 旨在通过提供 AI 对程…

STM32F4 Hal库中IO外部中断(EXIT)的应用

目录 概述 1 中断和事件 1.1 外部中断/事件控制器 (EXTI) 1.2 EXTI主要特性 1.3 中断和事件的差别 1.3.1 中断产生流程 1.3.2 事件产生流程 1.3.3 STM32F4的事件 2 STM32Cube配置工程 2.1 外部中断/事件介绍 2.2 配置参数 2.3 生成Project 3 STM32F4 Hal库中外部中…

【自动驾驶车辆-运动控制】运动学模型(Kinematic Model) | 手写数学推导公式 by.Akaxi

【前言】 在设计自动驾驶规控算法时&#xff0c;常常需要获取车辆的各种位姿、角度等信息&#xff0c;要控制车辆的运动&#xff0c;首先要对车辆的运动建立数字化模型&#xff0c;模型建立的越准确&#xff0c;对车辆运动的描述越准确&#xff0c;对车辆的跟踪控制的效果就越…

Redis入门到通关之Redis数据结构-String篇

文章目录 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&#xff1a; 在我的…

熊猫电竞赏金赛系统源码 APP+H5双端源码附搭建教程下载

熊猫电竞赏金系统简介 熊猫电竞赏金电竞系统 赏金赛源码&#xff0c;用户通过平台打比赛&#xff0c;赢了获得奖金奖励&#xff0c; 金币赛、赏金赛、vip赛等种赛事 可开王者荣耀、和平精英比赛 支持1v1、单排、双排组、战队排等多种比赛模式 支持QQ区、微信区 游戏玩的好…

react学习(一)之初始化一个react项目

React 是一个用于构建用户界面&#xff08;UI&#xff09;的 JavaScript 库&#xff0c;用户界面由按钮、文本和图像等小单元内容构建而成。React 帮助你把它们组合成可重用、可嵌套的 组件。从 web 端网站到移动端应用&#xff0c;屏幕上的所有内容都可以被分解成组件&#xf…

Kimi Chat四大更新详细解读!模型能力提升,支持语音输入输出!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

.net6项目模板搭建教程

1.集成log4net 安装如下扩展依赖即可&#xff0c;已经包含了log4net依赖&#xff1a; Microsoft.Extensions.Logging.Log4Net.AspNetCore 添加日志配置文件&#xff1a; 日志配置文件属性设置为始终复制&#xff1a; 注入服务&#xff1a; #region 注入log4net日志服务build…

【学习笔记之vue】vue项目放在springboot项目里后,刷新页面会显示whitelabel error page

vue项目放在springboot项目里后&#xff0c;刷新页面会显示whitelabel error page。 解决方案: 当你在Spring Boot项目中嵌入Vue项目&#xff0c;并且刷新页面时遇到了“Whitelabel Error Page”&#xff0c;这通常意味着Spring Boot后端没有正确地处理前端路由的请求。Vue.j…

X-Spider媒体下载工具

软件介绍 X-Spider 是一个功能丰富的推特媒体下载器&#xff0c;它不仅可以帮助用户从推特上下载图片和视频&#xff0c;还提供了一些高级的过滤功能。例如&#xff0c;用户可以通过指定日期范围来筛选需要下载的媒体文件&#xff0c;并且可以跳过已下载的重复文件&#xff0c…

ARTS Week 24

Algorithm 本周的算法题为 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; img 输入&#xff1a;list1 [1,2,4], list2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4] 实现代码如下&…

Centos7_miniconda_devtools安装_R语言入门之R包的安装

因为有同时反馈安装R包很慢或卡住。同事提供了一个安装R包的命令给我测试&#xff0c;在安装过程中复现报错信息&#xff0c;把下载慢或卡信的链接中的域名在防火墙中调整出口。 devtools::install_github("GreenleafLab/ArchR", ref"master", repos Bio…

助力突发异常事件预警保障公共安全,基于YOLOv7【tiny/l/x】模型开发构建公共生活场景下危险人员持刀行凶异常突发事件检测预警识别系统

基于AI目标检测模型的暴力持刀行凶预警系统是当下保障人民生命安全的新途径&#xff0c;近年来&#xff0c;公众场合下的暴力袭击事件频发&#xff0c;不仅给受害者及其家庭带来了深重的伤害&#xff0c;也对社会的稳定和安全造成了极大的威胁。在这种背景下&#xff0c;如何有…

为什么iPhone支持整页中文OCR应用很少?有什么好的解决方法?

iPhone上面没有支持中文整页OCR识别的app&#xff0c;这是一个值得探讨的问题。OCR&#xff0c;即光学字符识别&#xff0c;是一种将纸质文档或图片中的文字转化为可编辑文本的技术。随着科技的发展&#xff0c;OCR技术已经广泛应用于各个领域&#xff0c;包括文档处理、图像识…