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

第六部分:深度优先搜索

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.rhkb.cn/news/420241.html

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

相关文章

[项目][WebServer][项目介绍及知识铺垫][上]详细讲解

目录 1.何为WWW?2.HTTP分层1.整体2.细节3.DNS?4.协议之间是如何协同运作的&#xff1f; 3.Http相关概念1.特点2.URI && URL && URN3.HTTP URL格式 1.何为WWW? WWW是环球信息网的缩写&#xff0c;常简称为Web分为Web客户端和Web服务器程序&#xff0c;WWW可…

简单计算机网络概念

1.浏览器过程 输入url&#xff0c;解析url 1.协议http、https的区别&#xff1b;HTTPS就是在HTTP与TCP之间增加了SSL/TSL安全传输层 2.格式&#xff1a;协议//主机:端口/路径&#xff1b; 3.HTTP版本&#xff1a;1.0和1.1 4.HTTP/1.1&#xff1a;1. 持久连接&#xff1a;为了…

数据结构————单链表

引言 在计算机科学的领域里&#xff0c;数据结构的探索与应用是程序设计的灵魂。单链表&#xff0c;作为一种基础而灵活的数据结构&#xff0c;不仅在理论上有着丰富的内涵&#xff0c;其在实际编程中的应用亦是广泛而深远。本文旨在深入浅出地介绍单链表的实现过程&#xff0c…

探探我对测试开发的看法?

测试开发岗位主要负责确保软件的可用性和稳定性。 ● 可用性不仅包括功能的正常使用&#xff0c;还涵盖了软件在不同环境下的兼容性&#xff0c;如各种网络环境、不同 CPU 核心环境以及多样化的移动端设备等。 ● 稳定性方面我的理解是&#xff0c;测试人员不仅要从用户角度评判…

OpenAI gym: How to get complete list of ATARI environments

题意&#xff1a;OpenAI Gym&#xff1a;如何获取完整的 ATARI 环境列表 问题背景&#xff1a; I have installed OpenAI gym and the ATARI environments. I know that I can find all the ATARI games in the documentation but is there a way to do this in Python, witho…

UE5 半透明阴影 快速解决方案

Step 1&#xff1a; 打开该选项 Step 2&#xff1a; 将半透明材质给到模型后&#xff0c;设置光照的Shadow Resolution Scale&#xff0c;越大&#xff0c;阴影的效果越好 Step 3&#xff1a; 用这种方式去做&#xff0c;阴影会因为半透明的程度&#xff0c;降低阴影的浓度 要…

使用Azure+C#+visual studio开发图像目标检测系统

在这篇文章里面&#xff0c;我们讲解使用AzureC#visual studio在Azure上做图像的目标检测系统。 笔者是头一次接触C#。之前以Python Java和Scala为主。感觉C#.Net是一种挺好用的开发系统。C#和Java非常像。会一个学另一个很快。 首先&#xff0c;目标检测是个什么东西&#x…

【高校主办,EI稳定检索】2024年人机交互与虚拟现实国际会议(HCIVR 2024)

会议简介 2024年人机交互与虚拟现实国际会议&#xff08;HCIVR 2024&#xff09;定于2024年11月15-17日在中国杭州召开&#xff0c;会议由浙江工业大学主办。人机交互&#xff0c;虚拟现实技术的发展趋势主要体现在系统将越来越实际化&#xff0c;也越来越贴近人类的感知和需求…

python-新冠病毒

题目描述 假设我们掌握了特定时间段内特定城市的新冠病毒感染病例的信息。在排名 i 的当天有 i 个案例&#xff0c;即&#xff1a; 第一天有一例感染第二天有两例感染第三天有三例感染以此类推...... 请计算 n 天内的感染总数和每天平均感染数。 输入 整数 n 表示天数&…

将星 x17 安装ubuntu 20.04 双系统

准备工作&#xff0c;包含关闭快速启动&#xff0c;关闭Secret Boot 1.进入控制面板选择小图标&#xff0c;找到电源选项 2.点击更改当前不可用的设置&#xff0c;关闭快速启动 3.开机启动时快速按F2&#xff0c;进入BIOS 4.选择Setup Utiltity&#xff0c;选择Security&#…

LeetCode 热题 100 回顾5

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

ArcGIS之建模处理栅格数据以表格显示分区统计(以夜间灯光数据为例)

当需要计算一个shp数据中多个面中的栅格数据值是&#xff0c;可以通过模型构建器进行批量处理&#xff0c;也就是统计多个面中的栅格数据值。但在处理过程中可能会遇见不同的错误&#xff0c;本文会介绍ERROR000883的解决办法。 数据准备&#xff1a;一个shp数据&#xff08;例…

Idea 创建 Maven项目的时候卡死

文章目录 一、Archetype 和 Catalog1.1 Archetype&#xff08;原型&#xff09;1.2 Catalog&#xff08;目录&#xff09; 二、可能遇到的问题2.1 问题描述2.2 原因分析2.3 解决方案 参考资料 一、Archetype 和 Catalog 1.1 Archetype&#xff08;原型&#xff09; Archetype…

私域电商 IP 化发展的探索与优势

摘要&#xff1a;本文聚焦于私域电商与社交电商的区别&#xff0c;重点探讨私域电商的 IP 属性。深入分析其在获取流量、转化用户以及挖掘用户价值方面的独特优势。同时引入链动 2 1 模式、AI 智能名片、S2B2C 商城小程序源码等元素&#xff0c;详细阐述这些元素在私域电商 IP…

C++——哈希

目录 1.undered系列容器 1.1 undered_map 1.1.1 undered_map特点介绍 1.1.2 undered_map接口介绍 1.2 undered_set 2.底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.3.1 哈希函数设计原则&#xff1a; 2.3.2 常见哈希函数 1.直接定值法 2.除留余数法 3.平方…

数学建模笔记——层次分析法

数学建模笔记——层次分析法 数学建模笔记——层次分析法1. 层次分析法的基本原理和步骤2. 层次分析法的建模过程2.1 问题的提出2.2 模型原理2.3 为该问题建立层次结构模型2.4 构造判断矩阵1. 判断矩阵的含义2. 为该问题构造判断矩阵 2.5 一致性检验1. 一致性检验方法2. 对上述…

相机内存卡格式化了照片怎么恢复?格式化恢复详解

摄影爱好者们都知道&#xff0c;相机内存卡是记录我们美好瞬间的重要媒介。然而&#xff0c;在使用过程中&#xff0c;有时我们会因操作不当或设备故障&#xff0c;不小心格式化了内存卡&#xff0c;从而导致珍贵的照片丢失。面对这种情况&#xff0c;我们该如何恢复这些被格式…

电脑pe是什么意思_电脑pe系统作用详细分析

有些小白很好奇&#xff0c;电脑pe是什么意思?所谓的电脑pe系统其实就是当我们的电脑出现问题而不能进入正常系统时候的一种“紧急备用”系统。如果需要重装操作系统的话&#xff0c;以往采用光盘使用的比较多&#xff0c;随着技术的进步&#xff0c;用u盘制作一个pe启动盘去安…

【自然语言处理】实验一:基于NLP工具的中文分词

目录 前言 1. 导入jieba分词器 2. 用精确模式进行中文分词 3. 用全模式进行中文分词 4. 用搜索引擎进行中文分词 5. 利用 lcut返回结果列表(list) 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &a…

避免在C#循环中使用await

在C#中&#xff0c;异步编程因其能够提升应用程序性能和响应能力而变得越来越流行。async和await关键字使得编写异步代码变得更加容易&#xff0c;但如果使用不当&#xff0c;它们也可能引入一些陷阱。一个常见的错误是在循环中使用await&#xff0c;这可能导致性能瓶颈和意外行…