LeetCode 437. 路径总和 III

题目描述

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

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

示例

示例 1:

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

示例 2:

复制代码
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3

解法

1.前缀和 + DFS

解题思路

如果二叉树是一条链,本题就和 560. 和为 K 的子数组 完全一样了:统计有多少个非空连续子数组的元素和恰好等于 targetSum。所以你必须先弄明白 560 题(特殊情况),再来做本题(一般情况)。560 题的做法见 LeetCode 560. 和为 K 的子数组

我们要解决的问题是:DFS 遍历这棵树,遍历到节点 node 时,假设 node 是路径的终点,那么有多少个起点,满足起点到终点 node 的路径总和恰好等于 targetSum?

和 560 题一样的套路:一边遍历二叉树,一边用哈希表 cnt 统计前缀和(从根节点开始的路径和)的出现次数。设从根到终点 node 的路径和为 s,那么起点的个数就是 cnt[s−targetSum],加入答案。对比 560 题,我们在枚举子数组的右端点(终点),统计有多少个左端点(起点),做法完全一致。

cpp 复制代码
class Solution {
public:
    int pathSum(TreeNode* root, int targetSum) {
        int ans = 0;
        unordered_map <long long,int> m{{0,1}};
        auto dfs = [&](this auto&& dfs,TreeNode* node, long long s){
            if(node == nullptr) return;
            s += node -> val;
            if(m.find(s - targetSum) != m.end()) ans += m[s - targetSum];
            m[s] ++;
            dfs(node -> left,s);
            dfs(node -> right,s);
            m[s] --;
        };
        dfs(root,0);
        return ans;
    }
};

时间复杂度O(N),空间复杂度O(N)

相关推荐
Wect3 小时前
LeetCode 39. 组合总和:DFS回溯解法详解
前端·算法·typescript
Wect3 小时前
LeetCode 46. 全排列:深度解析+代码拆解
前端·算法·typescript
颜酱3 小时前
Dijkstra 算法:从 BFS 到带权最短路径
javascript·后端·算法
木心月转码ing5 小时前
Hot100-Day24-T128最长连续序列
算法
小肥柴6 小时前
A2UI:面向 Agent 的声明式 UI 协议(三):相关概念和技术架构
算法
学高数就犯困8 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
CoovallyAIHub11 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub11 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub12 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉