437. 路径总和 III

题解:DFS

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:long long rootSum(TreeNode* root, long long targetSum){if(!root){return 0;}int res = 0;if(root->val == targetSum){res ++;}res += rootSum(root->left, targetSum - root->val);res += rootSum(root->right, targetSum - root->val);return res;} long long pathSum(TreeNode* root, long long targetSum){if(!root){return 0;}int res = rootSum(root, targetSum);res += pathSum(root->left, targetSum);res += pathSum(root->right,targetSum);return res;}
};

题解-通俗易懂

发现AI讲题还挺有意思。单独加上一个 Section。

想象一下,你在一棵大树上寻宝,这棵树的每个树枝节点上都标有一个数字。你的任务是找到所有从某个节点出发,往下走,路径上所有数字加起来正好等于“目标宝藏值”(targetSum)的路线有多少条。

重要规则:这个路线不一定非要从最顶端的树根开始,也不一定非要走到最末端的叶子。它可以从任何一个节点开始,到它下面的任何一个节点结束。

这段代码用了“分工合作”的策略,设计了两个函数来完成这个任务:

  1. rootSum:一个“专一的探路者”。

  2. pathSum:一个“总指挥官”。


1. rootSum 函数详解 (专一的探路者)

rootSum 的任务非常简单和专一:它只负责寻找那些【必须】从当前我给它的这个节点 (root) 出发的寻宝路线。

我们来看看它是怎么工作的:

codeC++

long long rootSum(TreeNode* root, long long targetSum){// 如果这个节点是空的(路到头了),那肯定没路可走,返回 0 条。if(!root){return 0;}int res = 0; // 准备一个计数器,记录找到了几条路// 1. 先看看我自己是不是一个宝藏?//    就我一个节点,不多也不少,如果我的值正好等于目标值,那恭喜,找到了一条!if(root->val == targetSum){res++;}// 2. 接下来,我要把路往下延伸,去我的左子树里继续找。//    既然我已经走了我这一步 (root->val),那么接下来的路需要凑够的数就是 `targetSum - root->val`。//    于是我喊来另一个 `rootSum` 小分队,告诉它:“喂,从我的左孩子出发,帮我找找和为 `targetSum - root->val` 的路有多少条?”res += rootSum(root->left, targetSum - root->val);// 3. 同理,我也要去我的右子树里继续找。//    我也喊来另一个 `rootSum` 小分队,让它从我的右孩子出发,继续完成剩下的任务。res += rootSum(root->right, targetSum - root->val);// 把上面三步找到的路线总数加起来,就是从我这个节点出发的所有寻宝路线数量。return res;
}

rootSum 的小结: 你给它一个起点和一个目标值,它就勤勤恳恳地从这个起点往下走,告诉你从这个起点出发,有多少条路线的和恰好是那个目标值。


2. pathSum 函数详解 (总指挥官)

pathSum 的任务是总揽全局。它知道寻宝路线可以从 任何一个节点 开始,而 rootSum 只会从指定的节点开始。那怎么办呢?

很简单,pathSum 就遍历树上的每一个节点,然后对每一个节点都说:“喂,rootSum,现在轮到你上场了,把这个节点当做起点,去给我找路!”

我们来看看它的指挥过程:

codeC++

long long pathSum(TreeNode* root, long long targetSum){// 如果整棵树都是空的,那肯定一条路都没有。if(!root){return 0;}// 这里的总路线数,可以分成三个部分:// 1. 从【当前这个根节点】出发的路线。// 2. 完全在【左子树】内部的路线 (起点和终点都在左子树里)。// 3. 完全在【右子树】内部的路线 (起点和终点都在右子树里)。// 第一部分:让 `rootSum` 这个专家出马,计算一下从当前 `root` 节点出发的路线有多少条。int res = rootSum(root, targetSum);// 第二部分:我不管从当前节点出发的路了,我去它的左子树里看看。// 对左子树来说,它也是一棵完整的树,里面也可能藏着各种寻宝路线。// 于是我对自己下了一个同样的命令(递归调用):“喂,另一个我,去左子树里执行一遍完整的 `pathSum` 任务!”res += pathSum(root->left, targetSum);// 第三部分:同理,我也要去右子树里执行一遍完整的 `pathSum` 任务。res += pathSum(root->right, targetSum);// 把这三部分找到的路线数量全部加起来,就是最终的答案。return res;
}

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

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

相关文章

【Python】shutil.make_archive() 方法详解

文章目录功能概述函数签名核心参数详解1. base_name2. format3. root_dir4. base_dir使用示例将 /home/user/project/data 目录打包为 data.tar.gz,并保存到 /home/user/backups/打包当前工作目录下的 docs 文件夹为 zip 文件替代方案总结shutil.make_archive() 是 …

CAN总线(Controller Area Network Bus)控制器局域网总线(二)

6、错误帧 总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备。7、过载帧 当接收方收到大量数据而无法处理时&#…

LeetCode 317 离建筑物最近的距离

LeetCode 317 题的详细题目信息如下:题目名称Shortest Distance from All Buildings(中文译名:离建筑物最近的距离)题目描述给你一个由 0、1 和 2 组成的二维网格,其中:0 代表空地1 代表建筑物2 代表障碍物…

AI之CodeTool之Kode:Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略

AI之CodeTool之Kode:Kode(claude_code风格)的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之PE之SystemPrompt:analysis_claude_code的简介、使用方法、案例应用之详细攻略 AI之CodeTool之Kode:Kode(claude_code风格)的简…

网络请求优化:用 Retrofit 拦截器玩转日志、重试与缓存,OkHttp 和 Volley 谁更香?

目录 1. 拦截器:Retrofit 的“超级管理员” 拦截器的本质 为什么用拦截器? 2. 日志拦截器:让请求和响应“现原形” 引入日志拦截器 实现日志拦截器 日志输出示例 生产环境注意事项 3. 重试拦截器:网络不稳定也能稳如狗 设计重试逻辑 集成到 Retrofit 优化重试策…

LeetCode - 283. 移动零

题目 283. 移动零 - 力扣(LeetCode) 思路 我们使用左右两个指针:左指针left指向已处理好的非零元素的末尾位置,右指针right用于遍历数组。 算法步骤: 初始化left为-1(表示还没有处理任何非零元素&…

Redis不同场景下的注意事项

Redis常见的 使用场景: 缓存系统(核心场景) 存储热点数据,减少数据库访问压力。提升接口响应速度。技术点: 用String/Hash 存储结构化数据结合过期时间(TTL)和缓存淘汰策略(如LRU)管理内存。解决缓存问题:穿…

【完整源码+数据集+部署教程】高速公路施工区域物体检测系统源码和数据集:改进yolo11-RepNCSPELAN

背景意义 随着城市化进程的加快,高速公路建设与维护工作日益频繁,施工区域的安全管理成为亟待解决的重要问题。在高速公路施工区域,工人和设备的安全是首要考虑因素,而有效的物体检测系统能够显著提高施工现场的安全性与工作效率。…

如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全链路追踪如何让FastAPI微服务架构的每个请求都无所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全链路追踪是现代微服务架构中监控系统行为的核心技术,通…

Win11 压缩实测:Win11 的压缩软件的最佳配置和使用方式

文章目录测试环境机器配置被压缩文件WinRAR7zipLinux子系统准备极限压缩减小字典的极限压缩7zipWin11准备极限压缩7zip系统内置右键压缩菜单极限压缩总结:Win11 的压缩软件的最佳配置和使用方式测试环境 机器配置 Win11系统 16GB内存 8核CPU 被压缩文件 文件夹内…

CMake构建学习笔记22-libxml2库的构建

在上一篇文章《CMake构建学习笔记21-通用的CMake构建脚本》中,笔者封装了一个通用的cmake构建脚本cmake-build.ps1,那么这里笔者就尝试通过这个脚本来构建libxml2库。 libxml2是GNOME项目下的XML库,虽然比不上TinyXML-2轻量,但是…

虚拟私有网络笔记

VPN应用场景 ——VPN概述  利用公共网络来构建的私人专用网络称为虚拟私有网络(VPN, Virtual Private Network),用于构建VPN的公共网络包括Internet 、帧中继、ATM等。在公共网络上组建的VPN象企业现有的私有网络 一样提供安全性…

Python 轻量级 HTML 解析器 - lxml入门教程

文章目录初始化解析器路径查找查找所有标签查找指定 id 的标签查找指定 class 的标签查找包含指定 class 的标签复杂路径查找示例1示例2常见操作获取所有标签的链接获取 div 标签的文本内容, 其他标签类似其他元素操作初始化解析器 from lxml import html from lxml.html impor…

(CVPR-2025)VideoMage:文本生成视频扩散模型的多主体与动作定制化

VideoMage:文本生成视频扩散模型的多主体与动作定制化 paper title:VideoMage: Multi-Subject and Motion Customization of Text-to-Video Diffusion Models paper是National Taiwan University发表在CVPR 2025的工作 Code:链接 图1. 多主体与动作定制化…

OpenCV轮廓近似与Python命令行参数解析

在计算机视觉任务中,轮廓分析是目标检测、形状识别的核心步骤。而approxPolyDP函数作为轮廓简化的关键工具,能有效减少轮廓顶点数量,降低计算复杂度;同时,argparse库则能让Python脚本更灵活、易用。本文将结合具体案例…

基于Springboot在线音乐推荐平台

目录 一、项目介绍 二、功能介绍 三、核心代码 四、效果图 源码获取 前言 在经济繁荣的浪潮过去后,社会的焦点逐渐从物质追求转向了文化和生活品质的提升[1]。文化生活的繁荣成为人们关注的焦点之一,而音乐,作为文化的一部分&#xff0…

LeetCode算法日记 - Day 26: 归并排序、交易逆序对的总数

目录 1. 归并排序 1.1 题目解析 1.2 解法 1.3 代码实现 2. 交易逆序对的总数 2.1 题目解析 2.2 解法 2.3 代码实现 1. 归并排序 912. 排序数组 - 力扣(LeetCode) 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任…

C++(Qt)软件调试---vcpkg安装crashpad(34)

C(Qt)软件调试—vcpkg安装crashpad(34) 文章目录C(Qt)软件调试---vcpkg安装crashpad(34)[toc]1 概述🐜2 环境配置3 qt使用crashpad库捕获异常4 cmake中添加crashpad5 相关地址🐐更多精彩内容👉内…

Kafka 副本同步异常与 ISR 收缩故障排查实录

背景 某高流量 Kafka 集群(原 10G 网卡)在切中心时频繁触发带宽报警,扩容至 25G 网卡后出现副本同步异常: 操作流程:停机→升级网卡→重启→触发分区同步→切换首选 Leader现象: 写入流量上升后&#xff0c…

顶点 (VS)vs 片段(FS):OpenGL纹理滚动着色器的性能博弈与设计哲学

一个微妙的选择,影响整个应用性能表现在实时图形渲染中,实现纹理滚动效果是一种常见需求。但当我们在顶点着色器和片段着色器之间做出不同实现选择时,会对性能产生显著影响。今天,我们将深入探讨这两种实现的差异,帮助…