news 2026/4/23 17:21:11

hot100 437.路径总和Ⅲ

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hot100 437.路径总和Ⅲ

思路:前缀和解法,利用前缀和求节点值之和等于targetSum的路径的数目(满足路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的,只能从父节点到子节点)。

一、前缀和定义:

1.定义:一个节点的前缀和就是该节点到根之间的路径和。

2.举例:如下图所示。

(1)节点4的前缀和为:1 + 2 + 4 = 7。

(2)节点8的前缀和为:1 + 2 + 4 + 8 = 15。

(3)节点9的前缀和为:1 + 2 + 5 + 9 = 17。

二、本题中前缀和的作用:两节点间的路径和即为两节点的前缀和之差。

1.举例:

(1)如下图所示:假如题目给定数值为5,节点1的前缀和为1,节点3的前缀和为1 + 2 + 3 = 6。

(2)prefix(3) - prefix(1) == 5。

(3)所以节点1到节点3之间,有一条符合要求的路径2->3。

2.利用前缀和简化问题:我们只需要遍历整棵树一次,记录每个节点的前缀和,并查询该节点的祖先节点中符合条件的个数,将这个数量加到最终结果上。

三、HashMap存储数据:key存储前缀和,value是该前缀和的节点数量,记录数量是因为有出现重复路径的可能。

举例:如下图所示,改图中前缀和为1的节点有两个,分别是0和1,所以路径和为2的路径数就有两条,分别是0->2和2。

.

四、恢复状态的意义:

1.题目要求:路径方向必须是向下的,即只能从父节点到子节点。当计算两个节点的前缀和的差值时,其中一个节点必须是另一个节点的祖先节点。

2.换句话说,当我们把一个节点的前缀和信息更新到map里时,它应当只对其子节点们生效。

举例:下图中有两个值为2的节点A,B。

(1)当遍历到最右方的节点6时,对于它来说,此时的前缀和为2的节点只该有B,因为A并不是节点6的祖先节点。

(2)如果不做状态恢复的话,当遍历右子树时,左子树中A的信息仍会保留在map中,那么此时节点6就会认为A,B都是可追溯到的节点,从而产生错误。

3.状态恢复代码的作用:在遍历完一个节点的所有子节点后,将其从map中除去。

五、核心思想:寻找从根节点到当前节点的路径上,是否存在某个前缀和curSum - target。如果存在,则说明从那个前缀和对应的节点到当前节点的路径和正好等于target。

即:curSum - (curSum - target) == target。

附代码:

class Solution { Map<Long,Integer> prefixMap; int target; public int pathSum(TreeNode root, int targetSum) { prefixMap = new HashMap<>(); target = targetSum; // key表示前缀和,value表示前缀和为这个值的路径的数量。 // 初始化,表示空路径的前缀和为0,出现了1次,为了处理从根节点开始的路径 prefixMap.put(0L,1); return recur(root,0L); } // recur函数,用于遍历二叉树,对于每个节点,记录前缀和的同时,返回当前找到和为target的路径的数量 // curSum表示node节点之前的前缀和 private int recur(TreeNode node,Long curSum){ if(node == null){ return 0; } int res = 0; // 记录路径数量 curSum += node.val; // 根节点到当前节点的路径和 // 如果curSum - target在prefixMap中存在,则说明存在某个节点到当前节点的路径和等于target // curSum - (curSum - target) = target // 比如:target = 8,如果之前存在前缀和 = 5,且当前前缀和 = 13,那么13 - 5 = 8,说明从那个节点到当前节点的路径和为8 res += prefixMap.getOrDefault(curSum - target,0); // 把当前节点的前缀和也加入到哈希表中,value加1 prefixMap.put(curSum,prefixMap.getOrDefault(curSum,0) + 1); // 递归处理子树 int left = recur(node.left,curSum); int right = recur(node.right,curSum); res = res + left + right; // 所有找到的路径数量总和即为总的路径数量 // 恢复状态 prefixMap.put(curSum,prefixMap.get(curSum) - 1); // 当前节点处理完后,要返回到父节点,当前节点的前缀和不应该影响其他分支的统计。因此在遍历完一个节点的所有子节点后,将其从map中除去 return res; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 18:58:50

计算机Java毕设实战-基于springboot的机器人家电健康预警系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 11:20:28

国产CAD这笔软件授权费,省得有点心疼

开厂子的&#xff0c;每天都在算账。原材料在涨价&#xff0c;人工工资在涨&#xff0c;连以前用的那套国外工业软件&#xff0c;每年的维护费和授权费也是一笔不小的开支。那软件功能是强大&#xff0c;但对于我们主要做中低端汽配件的来说&#xff0c;大部分功能根本用不上&a…

作者头像 李华
网站建设 2026/4/23 11:36:58

游戏公司应该选择自建“IP库”还是直接购入 “IP库”?

最近在后台和私信里&#xff0c;被连续问到一个问题&#xff1a;“为什么游戏公司不自己做IP解析&#xff0c;反而会直接购买IP离线库&#xff1f;” “在线API明明也能查&#xff0c;为什么还要花钱买离线数据&#xff1f;”这个问题其实问得非常好&#xff0c;因为它其实是游…

作者头像 李华
网站建设 2026/4/23 13:19:22

家政老板必读:避开小程序开发四大坑,打造高效赚钱的家政系统

引言&#xff1a;家政行业的数字化转型之痛 “钱花了&#xff0c;功能却报废了”——这是许多家政老板在尝试数字化转型后的真实心声。花费数万元甚至更多资金开发的小程序&#xff0c;上线后却发现派单卡顿如PPT&#xff0c;预约系统形同虚设&#xff0c;客户流失率不降反升。…

作者头像 李华
网站建设 2026/4/23 11:36:31

目标检测数据集 - 野生动物检测数据集下载

数据集介绍&#xff1a;野生动物检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如旱季水源地聚集、迁徙通道穿越、灌丛遮蔽行走、野生动物遮挡、野生动物严重遮挡数据等&#xff0c;且类别丰富&#xff0c;划分为 "buffalo"、…

作者头像 李华