图解LeetCode——437. 路径总和 III

news2024/11/20 4:21:28

一、题目

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

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

二、示例

2.1> 示例 1:

输入】root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出】3
解释】和等于 8 的路径有 3 条,如图所示。

2.2> 示例 2:

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

提示:

  • 二叉树的节点个数的范围是 [0,1000]
  • -10^9 <= Node.val <= 10^9 
  • -1000 <= targetSum <= 1000

三、解题思路

根据题意,给出了我们解答此题的一些关键信息:

信息1】“径方向必须是向下”——根据这条信息,我们可以确定遍历操作方向;
信息2】“路径不需要从根节点开始,也不需要在叶子节点结束”——可以随意区间简单构成路径;

根据以上两条信息,我们可以首先先到采用前缀和的方式进行解题,因为前缀和适合解答那种连续、累积和这类题目。那么什么是前缀和呢?我们可以以下图为例,如果有4个节点,分别是10、5、2、1,它的前缀和就分别是10151718

那么我们可以通过前缀和的值来计算任意连续的节点和,比如:

求节点5到节点2之和】可以用前缀和17 - 前缀和10,那么结果就是5
求节点5到节点1之和】可以用前缀和18 - 前缀和10,那么结果就是8

了解了前缀和之后,我们就可以从树的root节点开始遍历,此处我们可以采用前序遍历的方式,那么还有两个细节问题需要解决:

问题1:采用什么数据结构来保存前缀和?

我们可以通过创建Map结构key=前缀和,value=相同前缀和值的数量;

问题2:采用前序遍历计算树节点的前缀和,难免会出现重复节点计算的情况,这个怎么办?

可以通过回溯的方式,将值还原到上一步,避免重复计算。

解题思路就这些了,大家采用:前序遍历+前缀和+回溯这3个思路结合方式解题即可。具体实现,请见下面代码实现部分。

四、代码实现

class Solution {
    private Map<Long, Integer> map;
    private int result = 0, target = 0;
    public int pathSum(TreeNode root, int targetSum) {
        if (root == null) return 0;
        target = targetSum;
        map = new HashMap();
        map.put(0L, 1);
        dfs(root, root.val);
        return result;
    }
    public void dfs(TreeNode node, long value) {
        result += map.getOrDefault(value - target, 0);
        map.put(value, map.getOrDefault(value, 0) + 1);
        if (node.left != null) dfs(node.left, value + node.left.val);
        if (node.right != null) dfs(node.right, value + node.right.val);
        map.put(value, map.getOrDefault(value, 0) - 1);
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

AI智能视频技术在安防监控领域的场景应用

AI智能视频技术是一种基于人工智能、深度学习和计算机视觉等技术的视频处理技术。它可以通过对视频进行分析和识别&#xff0c;实现各种智能化应用&#xff0c;如视频监控、智能家居、自动驾驶等。 目前&#xff0c;AI智能视频技术已经实现了人脸识别、行为分析、智能跟踪、场…

测试用例excel转word(Office word篇)

场景 我们在项目中&#xff0c;默认情况下是用我们的Excel用例模版输出测试用例。但是有的项目中&#xff0c;会要求在Word版本的测试计划或者测试报告中&#xff0c;写明测试用例。而我们的测试用例&#xff0c;有的项目有上千条&#xff0c;这个时候如果从Excel往Word中复制…

【支付宝小程序】医保接入文档网址

【支付宝小程序】医保接入文档 自己注意事项&#xff1a; 授权 my.getAuthCode跳转与参数 处理 my.ap.navigateToAlipayPage联调 测试开发者加入 白名单

【前端播放器】修改前端参数,减少时延

目录 程序修改 海康 CM8 换上新的jessibuca-3 好像提高到了1S内 与2.8的旧版本比下 191-196-2.8三个对比 jessibuca-pro 延时测试 jessibuca-pro 300ms 超低延迟 wvp-webrtc wvp-webrtc vs vms webrtc > jessibuca-pro > jessibuca 总体 参考资料 程序修改 …

不要把异常当做业务逻辑,这性能可能你无法承受

一&#xff1a;背景 1. 讲故事 在项目中摸爬滚打几年&#xff0c;应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬&#xff3f;┬)&#xff0c;比如说判断一个数字是否为整数,就想当然的用try catch包起来&#xff0c;再进行 int.Parse&#xff0c;如果抛异常就说明不…

基于Java家居商城系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

pl/sql developer oracle生僻字显示问题

一、问题由来 随着国标GB18030的推行&#xff0c;各行各业都在如火如荼的落实改造。自己在工作中也发现很多问题&#xff0c;查阅了很多资料都未解决自己的问题。经过慢慢摸索&#xff0c;对生僻字经常出现的问题进行总结&#xff0c;现分享如下。 二、问题描述 1. or…

超声功率放大器的工作原理和特点是什么

超声功率放大器是一种利用超声波振动产生机械振动的装置&#xff0c;通过将输入信号放大后输出到负载中&#xff0c;以实现对超声能量的有效利用。其工作原理和特点如下&#xff1a; 超声功率放大器的工作原理 超声功率放大器的工作原理是基于压电效应和磁致伸缩效应。当输入电…

2023亚马逊科技中国峰会之Amazon DeepRacer赛车比赛

目录 一、前言 二、什么是 Amazon DeepRacer 三、如何构建自己的第一个强化学习模型 1、创建 Amazon DeepRacer 资源 2、自定义你的赛道 3、开始你的模型 4、关于优化模型 5、在仿真器中测试 6、在真实赛道上测试你的模型 四、中国峰会总决赛 五、自动驾驶赛车名校邀…

使用PlotNeuralNet绘制深度学习网络图的基本操作(二)

使用PlotNeuralNet绘制深度学习网络图的基本操作&#xff08;二&#xff09; 接下来我们利用pycharm来绘制当中我们的神经网络模型架构&#xff0c;目标是直接将.tex文件生成为pdf和png。我在学习的过程中参考了一些学习视频&#xff0c;觉得这个up主讲的还不错&#xff1a; 1…

CH583,CH582,CH581 国产蓝牙芯片RISC-V内核BLE 5.3无线MCU

概述 CH583是集成BLE无线通讯的32位RISC微控制器。片上集成2Mbps低功耗蓝牙BLE 通讯模块、2个全速USB主机和设备控制器及收发器、2个SPI、4个串口、ADC、触摸按键检测模块、RTC等丰富的外设资源。 CH583相比CH582多了SP11主机&#xff0c;支持最低1. 7V电源电压。CH581 基于CH…

Java实现动态生成word报告

Java实现动态生成word报告 1.准备好docx文件模板 举例&#xff1a;动态生成表格数据&#xff0c;以下是list数组类型的freemarker语法 将写好的word模板加入到templates目录下 2.在pom.xml中导入相关依赖 <dependency><groupId>fr.opensagres.xdocreport</g…

react antd checkbox实现全选,多选

背景 目前好像只有table组件有实现表格数据的全选功能&#xff0c;如果说对于list&#xff0c;card&#xff0c;collapse等其他组件来说&#xff0c;需要自己结合checkbox来手动实现全选功能。 Checkbox.Group有实现全选功能&#xff0c;但是对于需要遍历出来的数据&#xff…

人民大学与加拿大女王大学金融硕士——原来“鱼和熊掌”可以兼得

“鱼和熊掌”不可兼得&#xff0c;我们从小就听到过这句话。随着长大&#xff0c;随着能力增强&#xff0c;两者我们都想要。就像在中国人民大学与加拿大女王大学金融硕士项目读研&#xff0c;我们不只要获得毕业证书&#xff0c;我们还要学到真本领。你的愿望在人大女王金融硕…

Ubuntu18.04离线安装Nginx

因需要安装nginx的服务器无法连接互联网&#xff0c;所以需要离线安装。首先需要下载nginx的安装包&#xff0c;之后进行安装&#xff0c;在安装之前需要保证gcc&#xff0c;g&#xff0c;make等依赖包已经安装。 因为是需要离线安装&#xff0c;所以在之前是用的一台互联网下载…

Java选择题刷题记录1

LinkedList类继承自AbstractSequentialList ArrayList listnew ArrayList(); 这种是默认创建大小为10的数组&#xff0c;每次扩容大小为1.5倍&#xff1b;ArrayList listnew ArrayList(20);这种是指定数组大小的创建&#xff0c;创建时直接分配其大小&#xff0c;扩充0次 Ite…

naive-ui NPopconfirm怎么用vue3的h()渲染

先看效果 然后我先贴代码&#xff0c; 你们看懂的先运行下&#xff0c; 文章后面我教你怎么 添加这种有template&#xff0c;有slot插槽的组件 h(NPopconfirm,{positiveButtonProps: {size: tiny,color: #007293,bordered: true,},negativeButtonProps: {size: tiny,color: #…

解决添加上@RequiresPermissions权限注解后无法访问接口,swagger读取不到的问题

目录 一、先搭建 Swagger 1、添加依赖库 2、创建Swagger配置类 3、配置yml 4、编写测试Web接口 5、测试Web接口 二、解决问题 1、出现的问题 2、解决问题 一、先搭建 Swagger 开发前后端分离架构的项目&#xff0c;往往调试后端Web接口需要用到POSTMAN工具。虽然POSTM…

智安网络|人工智能蔓延,网络安全所面临的威胁和应对之道

随着人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;技术的快速发展和广泛应用&#xff0c;我们进入了一个智能时代&#xff0c;人工智能已经蔓延到我们生活的方方面面。然而&#xff0c;与其带来的方便和创新相伴随的是网络安全所面临的新威胁。 【威…