LeetCode HOT 100 —— 437. 路径总和 III

news2025/2/6 1:09:55

题目

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
在这里插入图片描述
在这里插入图片描述

思路

方法一:双重递归

思想:首先先序递归遍历每个节点,再以每个节点作为起始点递归寻找满足条件的路径。

java代码如下:

class Solution { 
    int pathnumber;
    public int pathSum(TreeNode root, long sum) {//因为力扣有个特别变态的测试用例,[1000000000,1000000000,null,294967296,null,1000000000,null,1000000000,null,1000000000],int会溢出报错,所以要用long
            if(root == null) return 0;   
            Sum(root,sum);
            pathSum(root.left,sum);
            pathSum(root.right,sum); 
            return pathnumber;
        }
        
    
    public void Sum(TreeNode root, long sum){
        if(root == null) return;
        sum -= root.val;
        if(sum == 0){
            pathnumber++;           
        }
        Sum(root.left,sum);
        Sum(root.right,sum);
    } 
}

方法二:深度优先搜索
访问每一个节点 node,检测node为起始节点且向下延深的路径有多少种,递归遍历每一个节点的所有可能的路径,然后将这些路径数目加起来即为返回结果。

  1. 定义 rootSum(p,val)表示以节点 p为起点向下且满足路径总和为 val的路径数目,对二叉树上每个节点 p 求出 rootSum(p,targetSum),然后对这些路径数目求和即为返回结果。
  2. 对节点 prootSum(p,targetSum)时,以当前节点 p 为目标路径起点,不断递归向下进行搜索。假设当前的节点 p 的值为 val,对左子树和右子树进行递归搜索,对节点 p 的左孩子节点 p_left求出 rootSum(p_left,targetSum−val),以及对右孩子节点 p_right求出 rootSum(p_right,targetSum−val)。节点prootSum(p,targetSum)即等于rootSum(p_left,targetSum−val)rootSum(p_right,targetSum−val)之和,同时还需要判断一下当前节点 p 的值是否刚好等于 targetSum
  3. 采用递归遍历二叉树的每个节点 p,对节点 prootSum(p,val),然后将每个节点所有求的值进行相加求和返回。

java代码如下:

class Solution {
	//同理参数类型也是用long,否则有一个变态的测试用例通不过
    public int pathSum(TreeNode root, long targetSum) {//pathSum表示最终的结果,包含每一个节点的结果
        if (root == null) {
            return 0;
        }

        int ret = rootSum(root, targetSum);
        ret += pathSum(root.left, targetSum);
        ret += pathSum(root.right, targetSum);
        return ret;
    }

    public int rootSum(TreeNode root, long targetSum) {//rootSum表示当前节点开始往下的路径数目
        int ret = 0;

        if (root == null) {
            return 0;
        }
        int val = root.val;
        if (val == targetSum) {
            ret++;
        } 

        ret += rootSum(root.left, targetSum - val);
        ret += rootSum(root.right, targetSum - val);
        return ret;
    }
}

方法三:前缀和

对方法二中的重复计算进行优化

在这里插入图片描述
java代码如下:

class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        Map<Long, Integer> prefix = new HashMap<Long, Integer>();
        prefix.put(0L, 1);//当targetSum 等于某个节点值时,curPrefix - targetSum = 0,即当前节点前缀和为0,但是当前节点自己也算做一条符合条件的路径,所以也要计数
        return dfs(root, prefix, 0, targetSum);
    }

    public int dfs(TreeNode root, Map<Long, Integer> prefix, long curr, int targetSum) {
        //递归终止的条件
        if (root == null) {
            return 0;
        }
		//先序遍历
        int ret = 0;
        curr += root.val;//当前节点的前缀和

        ret = prefix.getOrDefault(curr - targetSum, 0);//当前节点的前缀和,如果前缀和中存在curr - targetSum,则返回对应的value,否则返回0
        prefix.put(curr, prefix.getOrDefault(curr, 0) + 1);
        ret += dfs(root.left, prefix, curr, targetSum);
        ret += dfs(root.right, prefix, curr, targetSum);
        //因为先序遍历是遍历根、左、右,即当前节点及其所有子节点,所以当遍历完当前节点和其所有子节点之后,当前节点的前缀和就没有用了,就需要把map里的记录删除,否则会影响其他子树的计算。跟当前节点没有路径关系的节点,不需要当前节点的前缀和
        prefix.put(curr, prefix.getOrDefault(curr, 0) - 1);
        return ret;
    }
}

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

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

相关文章

WebSocket新一代推送技术及Java Web实现

WebSocket简介 很多网站为了实现推送技术&#xff0c;所用的技术都是轮询。轮询是在特定的时间间隔&#xff08;如每1秒&#xff09;&#xff0c;由浏览器对服务器发出HTTP请求&#xff0c;然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点&#…

Visual Studio 控制台程序世界杯足球C语言版

Visual Studio 控制台程序世界杯足球C语言版程序之美前言主体运行效果核心代码逻辑分析结束语程序之美 前言 一年一度的世界杯如期而至&#xff0c;相信很多球迷小伙伴们一定不会错过这个难得的好机会&#xff0c;大饱眼福&#xff0c;美美的看上几场。 说起国际足联世界杯&a…

架构师必读 —— 逻辑模型(9)

逻辑树分析法 整理信息时&#xff0c;釆用逐条列举的方式是比较方便的。逐条列举的优点是可以简练地整理要点&#xff0c;利于缩小论点的范围&#xff0c;也方便项目的分类。但是&#xff0c;逐条列举也有缺点&#xff0c;就是遗漏和重复不太容易被发现&#xff0c;难以判断是否…

健身房训练计划

文章目录参考资料前言新手健身的首要任务训练计划关于组数、次数、重量和组间休息时间周一胸肌和手臂参考资料 男生健身房一周训练计划, 收藏了 最高效的健身房一周训练计划表&#xff0c;附完整动图教学&#xff01; 前言 新手健身的首要任务 1、了解和熟练掌握锻炼身体各…

从源码的角度解析Spirng 的import标签和alias标签的处理

在上一篇博客《源码深度剖析Spring Bean标签的解析及注册》中描述了bean 标签的解析以及注册。 而Spring 的XML 配置文件职工包括import标签、alias标签、bean标签和beans 标签&#xff0c;那么这篇博客就针对剩余的import 标签 、alias标签进行处理。由于beans标签类似于impor…

docker基础

目录常用命令Docker命令镜像命令(image)容器命令(container)容器数据卷命令挂载具名挂载和匿名挂载查看卷信息数据卷权限dockerfile挂载新建dockerfile文件build构建dockerfile的镜像用自定义的镜像启动容器查看主机挂载路径容器共享数据卷多容器创建DockerFile文件创建dockerf…

三大管理法则—鱼缸法则、木桶效应、热炉法则

一、鱼缸法则 鱼缸法则运用到管理中&#xff0c;就是增加工作的透明度。 各项工作有了透明度&#xff0c;领导者的行为就会置于全体下属的监督之下&#xff0c;就会有效地防止领导者滥用权力&#xff0c;从而强化领导者的自我约束机制。 项目管理中&#xff0c;管理者可以使…

AI 编剧大师 #Dramatron

DeepMind 近日发布了一款名为 “Dramatron” 的新 AI 写作模型&#xff0c;用上它人人都可以变身编剧或者作家&#xff0c;只需要给出一句话大纲&#xff0c; Dramatron 就能生成包括标题、角色列表、情节、场景描述和对话的完整电影 or 戏剧脚本&#xff0c;并且连贯性极强。简…

解决安全生产知识题库小程序加载超大数据无法渲染的问题

遇到问题 在搭建安全生产知识竞赛题库小程序的时候&#xff0c;由于题库的题量太大了&#xff0c;一次性加载setData或者多次concat后setData&#xff0c;其实它俩都是一次性setData&#xff0c;这样就会造成加载超大数据无法渲染空白的问题。 安全生产知识竞答 解决微信小程序…

计算机毕设Python+Vue学生日常事务管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

line-height:1的存在意义是什么(v1)

一、line-height:1的存在意义是什么&#xff08;v1&#xff09; 1. 加不加这段代码的区别是什么&#xff1f; 示例代码 <!DOCTYPE html> <html lang"en"> <style>p{line-height:1;} /* 随时注释的line-height:1 */p{margin:0;background-color:…

《罗马革命》豆瓣 9.1 从恺撒大帝到屋大维

《罗马革命》 关于作者 本书的作者罗纳德•塞姆&#xff0c;是英国牛津大学古罗马历史教授&#xff0c;被誉为20世纪西方世界最出色的罗马史学家。 关于本书 本书的作者抛弃了古罗马史家的论述&#xff0c;从政治史研究的角度&#xff0c;观察罗马革命的前因后果&#xff0c…

Java——记录BigDecimal与0比较的一个坑

文章目录前言问题解决问题解决前言 在之前做的一个项目中&#xff0c;为了保证BigDecimal在除数 divide时&#xff0c;如果被除数为0&#xff0c;出现java.lang.ArithmeticException: / by zero 报错问题&#xff0c;写了一个对比。具体代码如下&#xff1a; public static B…

Promise(一) 介绍及基本使用+API

目录 1.Promise 的理解和使用 1.1. Promise 是什么? 1.1.1. 理解 1.2. 为什么要用 Promise? 1.2.1. 指定回调函数的方式更加灵活 1.2.2. 支持链式调用, 可以解决回调地狱问题 1.3 promise初体验 1.4 Promise实践练习——fs读取文件 1.5 Promise实践练习——Ajax请求…

论文精讲 | 一种隐私保护边云协同训练

作者&#xff1a;王森、王鹏、姚信、崔金凯、胡钦涛、陈仁海、张弓 &#xff5c;单位&#xff1a;2012实验室理论部 论文标题 MistNet: Towards Private Neural Network Training with Local Differential Privacy 论文链接 https://github.com/TL-System/plato/blob/main/…

安装MYSQL 社区版 mysql 8.0.30

https://dev.mysql.com/downloads/ 上面地址下载 安装社区版&#xff0c;选择开发者选项 mysql社区版 8.0.30&#xff0c; 直接都下一步&#xff0c;下一步的安装 安装进度一直在显示 安装完成&#xff0c; 下一步 开发者 输入密码&#xff1a; 增加用户 sa 又是一番执行 …

Effective C++(一):让自己习惯C++

个人读书记录&#xff0c;不适用教学内容。 目录 条款01&#xff1a;视C为一个语言联邦 条款02&#xff1a;尽量以const&#xff0c;enum&#xff0c;inline替换#define 条款03&#xff1a;尽可能使用const 所谓的"顶层const"和"底层const" const返回…

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别?54.7.1 Sentinel与Hystix…

计算机毕设Python+Vue学生社团管理(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于蓝牙AOA技术的智慧医疗解决方案

1. 应用背景 医院需求分析在医疗体制不断完善的今天&#xff0c;医院的信息化程度已经大大提高&#xff0c;现在的大型医院都已经用上了医院信息系统(HIS)&#xff0c;它是医院管理同现代软件技术、网络技术相结合的产物。应用HIS系统后&#xff0c;确实方便了群众就医&#x…