路径总和|||-leetcode

题目描述

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

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

示例 1:

img

输入: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

提示:

  • 二叉树的节点个数的范围是 [0,1000]
  • -109 <= Node.val <= 109
  • -1000 <= targetSum <= 1000

解法一

思路:

利用前缀和和回溯。前缀和curr为:由根结点到当前结点的路径上所有节点的和。对于某个节点,如果curr-target出现在了某个节点前缀和当中,说明那个节点到当前节点存在符合条件路径。

img

5的左子节点3,该节点上的前缀和为18,目标是818-8=10,而前缀和为10出现在根节点上,那么根节点之后的节点5->3存在符合条件的路径。

代码:

    public int dfs(TreeNode root, Map<Long, Integer> prefix, long curr, int targetSum)  {
        if(root == null) return 0;

        //表示当前符合条件的路径个数
        int ret=0;
        //当前的前缀和
        curr+=root.val;

        //以当前节点为尾节点符合条件的路径次数
        ret=prefix.getOrDefault(curr-targetSum,0);
        //更新当前的前缀和出现次数
        prefix.put(curr,prefix.getOrDefault(curr,0) + 1);
        //在左子树寻找答案
        ret+=dfs(root.left,prefix,curr,targetSum);
        //在右子树寻找答案
        ret+=dfs(root.right,prefix,curr,targetSum);
        //回溯时,当前节点不在考虑范围内,需要把当前节点所带来的影响删除
        prefix.put(curr,prefix.get(curr)-1);
        return ret;
    }

    public int pathSum(TreeNode root, int targetSum) {
        //prefix 记录前缀和,键是前缀和,值是前缀和出现的次数
        Map<Long, Integer> prefix = new HashMap<Long, Integer>();
        //0的前缀和出现1次,这样当某条路径从根开始累加刚好等于 targetSum 时:
        //    curr - targetSum = 0 就能被统计到。
        prefix.put(0L, 1);
        return dfs(root, prefix, 0, targetSum);
    }
posted @ 2026-03-17 21:23  狐狸胡兔  阅读(1)  评论(0)    收藏  举报