七七老师の白日梦
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

路径总和Ⅲ:递归

写作时间:2026-08-07 08:55:09

题目

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

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

思考

求和,想到什么?两数之和,梦开始的地方,接下来是前缀和,这个思想很重要,但是我总是忽略

代码

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        // key: 前缀和, value: 该前缀和出现的次数
        Map<Long, Integer> prefixSumCount = new HashMap<>();

        // 基础情况:前缀和为 0 出现 1 次(用于处理从根节点开始的路径)
        prefixSumCount.put(0l, 1);

        return dfs(root, 0l, targetSum, prefixSumCount);
    }

    private int dfs(TreeNode node, long currSum, int targetSum, Map<Long, Integer> prefixSumCount) {
        if (node == null) {
            return 0;
        }

        // 1. 计算当前节点的前缀和
        currSum += node.val;

        // 2. 查找是否有符合条件的前缀和 (currSum - targetSum)
        int res = prefixSumCount.getOrDefault(currSum - targetSum, 0);

        // 3. 将当前前缀和存入哈希表
        prefixSumCount.put(currSum, prefixSumCount.getOrDefault(currSum, 0) + 1);

        // 4. 递归遍历左右子树
        res += dfs(node.left, currSum, targetSum, prefixSumCount);
        res += dfs(node.right, currSum, targetSum, prefixSumCount);

        // 5. 回溯:离开当前节点时,将其前缀和的计数 -1,避免影响其他分支
        prefixSumCount.put(currSum, prefixSumCount.get(currSum) - 1);

        return res;
    }
}


‍

avatar

七七老师

分享代码日常

RECOMMENDED

七七旧事:复盘并改变写博客的方式

2026-07-02 22:54:38

字母异位词

2026-07-04 22:22:08

寻找两个正序数组的中位数:合并与二分

2026-07-08 15:56:26

Table of Contents