算法入门-深度优先搜索3

news2024/9/19 17:18:14

第六部分:深度优先搜索

112.路径总和(简单)

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

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

第一种思路:

  1. 空节点检查

    • if (root == null) return false;

    • 这行代码确保在递归过程中,如果当前节点为空,函数将返回 false。这是基础的边界条件,防止在空节点上进行操作。

  2. 叶子节点检查

    • if (root.left == null && root.right == null) { return root.val == targetSum; }

    • 这段代码检查当前节点是否为叶子节点(即没有左子节点和右子节点)。如果是叶子节点,函数将检查当前节点的值是否等于 targetSum。如果相等,返回 true,表示找到了一个有效路径;否则返回 false

  3. 更新目标和并递归

    • targetSum -= root.val;

    • 这行代码更新 targetSum,减去当前节点的值。这样做是为了在递归调用时,检查从根节点到当前节点的路径和是否能达到目标值。

    • return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum);

    • 这行代码递归地检查左子树和右子树,返回两个子树中任意一个是否存在有效路径的结果。如果左子树或右子树中有路径和等于 targetSum,则返回 true

一开始在下面的条件判断时,

        

// 如果当前节点为空,返回 false  
if (root == null) return false;  

我添加了如下条件,但是如果再添加这些条件,会遗漏一些情况。

//第一种
if(root == null || root.val - targetSum > 0)    return false;
//这个条件会导致一些不必要的返回 false 的情况。比如,如果 root.val 是负数,而 targetSum 是正数,可能会导致错误的判断。这个条件并不是判断路径和是否可能的有效方式。

//第二种
if(root == null || Math.abs(root.val) > Math.abs(targetSum))    return false;
//root.val - targetSum > 0 这个条件的意图是检查当前节点的值是否大于目标和。这会导致以下问题:
//漏掉负数路径:如果树中存在负数节点,可能会导致路径和在某些情况下仍然可以达到 targetSum,但由于当前节点的值大于目标和而被错误地返回 false。
//不考虑路径的累积和:这个条件只比较当前节点的值与目标和,而没有考虑到从根节点到当前节点的路径和。路径和是由多个节点的值累积而成的,单独比较当前节点的值是不够的。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {  
    public boolean hasPathSum(TreeNode root, int targetSum) {  
        // 如果当前节点为空,返回 false  
        if (root == null) return false;  

        // 如果当前节点是叶子节点,检查路径和是否等于目标值  
        if (root.left == null && root.right == null) {  
            return root.val == targetSum;  
        }  

        // 递归检查左右子树,更新目标值  
        targetSum -= root.val;  
        return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum);  
    }  
}

113.路径总和II(中等)

题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]

第一种思路:

要找到从根节点到叶子节点的所有路径总和等于给定目标和的路径,需要在递归过程中维护当前路径,并在到达叶子节点时检查路径和是否等于目标和。此外,还需要在返回时移除当前节点的值,以便在回溯时不会影响其他路径。

这种方法有效地使用深度优先搜索(DFS)来查找所有有效路径,同时通过回溯确保探索所有潜在路径。

  1. 初始化pathSum 方法初始化了两个列表:list 用于存储所有有效路径,tempList 用于跟踪当前正在探索的路径。

  2. 递归探索findPaths 方法是一个递归函数,用于探索二叉树中的每个节点:

    • 如果当前节点为 null,则直接返回(基本情况)。

    • 将当前节点的值添加到 tempList 中。

  3. 叶子节点检查:如果当前节点是叶子节点(左右子节点均为 null)并且其值等于剩余的 targetSum,则表示找到了一条有效路径。将 tempList 的副本添加到 list 中。

  4. 继续搜索:如果当前节点不是叶子节点,函数会递归调用自身,分别处理左子节点和右子节点,同时调整 targetSum,减去当前节点的值。

  5. 回溯:在探索完两个子节点后,函数通过从 tempList 中移除最后添加的节点值来进行回溯。这一步是至关重要的,因为它允许函数在不保留先前路径值的情况下探索新路径。

class Solution {  
    // 主方法,用于查找所有路径,使其节点值之和等于 targetSum  
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {  
        // 存储所有有效路径的列表  
        List<List<Integer>> list = new ArrayList<>();  
        // 临时列表,用于存储当前路径  
        List<Integer> tempList = new ArrayList<>();  
        // 开始递归查找路径  
        findPaths(root, targetSum, tempList, list);  
        return list;  
    }  

    // 辅助方法,执行回溯  
    private void findPaths(TreeNode node, int targetSum, List<Integer> tempList, List<List<Integer>> list) {  
        // 基本情况:如果当前节点为 null,返回  
        if (node == null) return;  

        // 将当前节点的值添加到路径中  
        tempList.add(node.val);  

        // 检查是否为叶子节点,并且路径和等于 targetSum  
        if (node.left == null && node.right == null && node.val == targetSum) {  
            // 如果路径和匹配,将当前路径的副本添加到列表中  
            list.add(new ArrayList<>(tempList));   
        } else {  
            // 继续探索路径,更新 targetSum  
            // 从 targetSum 中减去当前节点的值,探索左子树  
            findPaths(node.left, targetSum - node.val, tempList, list);  
            // 探索右子树  
            findPaths(node.right, targetSum - node.val, tempList, list);  
        }  

        // 回溯:从路径中移除当前节点的值  
        tempList.remove(tempList.size() - 1);  
    }  
}

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

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

相关文章

【QT Creator】基本使用

一、常见问题 解答可见以下链接&#xff1a; https://www.cnblogs.com/xia-weiwen/p/10074882.html#title3.1 ** 有关控制台选择构建套件缺失的解决方法可见以下链接 https://blog.csdn.net/xuxu_123_/article/details/131257928 二、如何创建第一个QT项目 第一步&#xf…

一文解答Swin Transformer + 代码【详解】

文章目录 1、Swin Transformer的介绍1.1 Swin Transformer解决图像问题的挑战1.2 Swin Transformer解决图像问题的方法 2、Swin Transformer的具体过程2.1 Patch Partition 和 Linear Embedding2.2 W-MSA、SW-MSA2.3 Swin Transformer代码解析2.3.1 代码解释 2.4 W-MSA和SW-MSA…

Elasticsearch入门安装

1、下载安装 &#xff08;1&#xff09;安装Elasticsearch 下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 解压后运行 /bin/elasticsearch.bat 运行后访问 http://127.0.0.1:9200/即可 ps1&#xff1a;若无法访问且控制台打印 received plaintex…

计算机基础之-TCP 别再问我啦

TCP 协议 格式及部分含义根据端口号找到上一层的进程如何解包-整个包长度 ACK应答机制序号-确认序号-实现TCP的可靠传输和流量控制:为什么要有两个字段(序号和确认序号)&#xff1f; 16位窗口大小-缓冲区流量控制16位紧急指针三次握手四次挥手为啥 TIME_WAIT 滑动窗口 协议 格式…

代码随想录冲冲冲 Day40 动态规划Part8

121. 买卖股票的最佳时机 dp[i][0] 代表第i天持有股票手上的金额 dp[i][1] 代表第i天不持有股票手上的金额 初始化&#xff1a; dp[0][0] 持有所以是-prices[0] dp[0][1] 不持有所以是0&#xff1b; 递推公式: dp[i][0] 既然是i天时持有&#xff0c;那么就是之前就持有&…

开放式耳机具备什么特点?2024排行前十的四款百元蓝牙耳机推荐

开放式耳机具有以下特点&#xff1a; 佩戴舒适&#xff1a; 开放式耳机通常不需要插入耳道&#xff0c;能减少对耳道的压迫和摩擦&#xff0c;长时间佩戴也不易产生闷热、疼痛或瘙痒等不适&#xff0c;对于耳道敏感或不喜欢入耳式耳机压迫感的人来说是很好的选择。 这类耳机…

无线通信里的一些参数(dB dBm RSRP RSRQ RSSI SIN) / 天线增益

目录 历史由来dB和dBmRSRP RSRQ RSSI SNRRSSI在实际测试环境中的应用天线增益 详细阅读&#xff1a; 一文搞懂dB、dBm、dBw、dBi的来龙去脉 无线通信中 RSRP RSRQ RSSI SINR的定义和区别 RSRP RSRQ RSSI SNR的含义和区别 历史由来 dB展开应写为decibel&#xff0c;其中“deci…

【震撼】8岁女孩用Cursor编程,你还在等什么

1. Cursor: 革新性的AI代码编辑器 1.1 Cursor的崛起 近期&#xff0c;AI驱动的代码编辑器Cursor在开发者社区中引起了广泛关注。其火爆程度不仅源于AI大咖Andrej Karpathy在社交平台X上的推荐&#xff0c;更因一则令人惊叹的新闻&#xff1a;一位年仅8岁的小女孩利用Cursor和其…

金士顿NV2 2TB假固态硬盘抢救记,RL6577/RTS5765DL量产工具,RTS5765DL+B47R扩容开卡修复

之前因为很长时间不买固态硬盘&#xff0c;没注意到NVME的固态盘也有了假货和扩容盘&#xff0c;花200多块买了个2TB的金士顿NV2固态硬盘&#xff0c;我原本以为NV1的假货最多是用黑片冒充正片&#xff0c;结果没想到NV2居然有扩容的。后来发现是扩容盘的时候&#xff0c;已经过…

C++ 音频

一、采样频率 当前主流的采样频率为22.05KHz、44.1KHz、48KHz 22.05KHz&#xff1a;为FM广播声音品质 44.1KHz&#xff1a;为理论上最高的CD声音品质&#xff08;直播&#xff0c;录像&#xff0c;acc&#xff09; 48KHz&#xff1a;人耳可分辨的最高采样频率 &#xff08;…

使用PXE实现自动化安装rockylinux8.10

PXE 一、简介 实现多台服务器自动化安装系统。 二、部署 这里宿主机是 centos7&#xff0c;PXE 部署的是 rockylinux8.10。宿主机需提前关闭 selinux 和防火墙。 2.1 部署 dhcp 安装 dhcp [roottest-server ~]# yum install -y dhcp修改配置文件 # 复制默认的配置文件 …

极光出席深圳国际人工智能展并荣获“最具投资价值人工智能奖”

9月8-10日&#xff0c;由深圳市工业和信息化局、深圳市发展和改革委员会、深圳市科技创新局、深圳市政务服务和数据管理局、深圳市中小企业服务局共同指导&#xff0c;深圳市人工智能行业协会主办的第五届深圳国际人工智能展正式开幕。作为中国领先的客户互动和营销科技服务商&…

基于人工智能的智能农业监控系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 智能农业是利用现代信息技术和人工智能进行农业生产的优化管理&#xff0c;通过实时监控和预测系统&#xff0c;可以改善作物的生产效…

工控安全需求分析与安全保护工程

工控系统安全威胁与需求分析 工控系统&#xff08;ICS&#xff09;&#xff0c;是由各种控制组件、监测组件、数据处理与展示组件共同构成的对工业生产过程进行控制和监控的业务流程管控系统 分类&#xff1a;离散制造类和过程控制类 工控系统安全保护机制与技术 工控系统安全…

无人机加速度计的详解!!!

一、加速度计的基本定义 加速度计是一种用于测量物体加速度的传感器。它能够感知物体在各个方向上的加速度变化&#xff0c;并将这些变化转换为电信号进行输出。 二、加速度计的工作原理 加速度计的工作原理基于牛顿第二定律&#xff0c;即力等于质量乘以加速度&#xff08;…

Pygame中Sprite类实现多帧动画3-2

3.2.3 设置帧的宽度、高度、范围及列数 通过如图6所示的代码设置帧的宽度、高度、范围及列数。 图6 设置帧的宽度、高度、范围及列数的代码 其中&#xff0c;frame_width、frame_height、rect和columns都是MySprite类的属性&#xff0c;在其__init__()方法中定义&#xff0c;…

计算机毕业设计选题推荐-产品委托配送系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

【项目综合】基于 Boost 库的站内搜索引擎(保姆式讲解,小白包看包会!)

目录 一、项目背景 1&#xff09;搜索引擎是什么 2&#xff09;Boost 库是什么 3&#xff09;搜索的结果是什么 二、项目原理 1&#xff09;宏观原理和整体流程 2&#xff09;正序索引与倒序索引 3&#xff09;所用技术栈和项目环境 4&#xff09;项目源码地址&#x…

[【人工智能学习笔记】4_3 深度学习基础之卷积神经网络

卷积神经网络概述 卷积神经网络(Convolutional Neural Network, CNN)一种带有卷积结构的深度神经网络,通过特征提取和分类识别完成对输入数据的判别;在1989年提出,早期被成功用于手写字符图像识别;2012年更深层次的AlexNet网络取得成功,伺候卷积神经网络被广泛应用于各…

5G毫米波阵列天线仿真——CDF计算(方法一)

累计分布函数&#xff08;CDF&#xff09;在统计学上是一个由0增长到1的曲线。5G中CDF被3GPP标准推荐使用&#xff0c;5G 天线阵的有效全向辐射功率EIRP的CDF函数被用来评价设备的质量和性能。由于EIRP是在某一个方向角theta, phi上的辐射功率&#xff0c;幅值由天线增益与激励…