力扣HOT100之二叉树: 437. 路径总和 III

感觉这道题还是有点难,想了半天没想出来直接去看题解了,感觉要反复刷。这道题和之前的560. 和为 K 的子数组很像,对应的博客是这篇,建议先去看前面的博客再来看这道题。这道题更难一些,这道题需要用哈希表来记录符合条件的前缀的个数,除此以外,我们还需要用到回溯的思想,因为我们是根据当前的节点值来向上查找路径个数,当我们在一个左子树中查找完所有符合条件的路径后,还需要到右子树中查找符合条件的路径,但是右子树中的路径的节点与左子树完全不相关,所以我们需要及时回退,将哈希表中关于左子树路径相关的记录删除。感觉这道题的思路还是不太好描述,最好还是结合灵神的题解来看。

cpp 复制代码
/**
 * 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:
    int pathSum(TreeNode* root, int targetSum) {
        int result = 0;
        //初始化哈希表,必须这么做
        //目的是防止根节点值正好等于targetSum的情况无法被统计
        unordered_map<long long, int> Hash{{0, 1}};  
        //定义递归遍历二叉树的lambda函数
        auto dfs = [&](this auto&& dfs, TreeNode* node, long long s){
            //递归终止条件
            if(!node) return ;
            //单层递归主体
            s += node -> val;
            //将node当作路径的重点,统计起点的数量
            result += Hash[s - targetSum];   //如果没有s - targetSum这个键就会新建,且值为0
            //回溯
            Hash[s]++;
            dfs(node -> left, s);
            dfs(node -> right, s);
            Hash[s]--;
        };
        dfs(root, 0);
        return result;
    }
};
相关推荐
leke200342 分钟前
2025年10月17日
算法
CoovallyAIHub44 分钟前
Mamba-3震撼登场!Transformer最强挑战者再进化,已进入ICLR 2026盲审
深度学习·算法·计算机视觉
海绵宝宝的好伙伴1 小时前
【数据结构】哈希表的理论与实现
数据结构·哈希算法·散列表
Aqua Cheng.1 小时前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表
怀揣小梦想1 小时前
跟着Carl学算法--哈希表
数据结构·c++·笔记·算法·哈希算法·散列表
Nebula_g1 小时前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
Kent_J_Truman1 小时前
【模拟散列表】
数据结构·算法·蓝桥杯·散列表·常识类
Lchiyu1 小时前
哈希表 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
算法
对纯音乐情有独钟的阿甘1 小时前
【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数
c++·哈希算法·散列表
玩镜的码农小师兄1 小时前
[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决
c++·算法·leetcode·面试·位运算·hot100