【LeetCode】437.路径总和Ⅲ

题目

给定一个二叉树的根节点 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

提示:

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

解答

源代码

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        Map<Long, Integer> preSum = new HashMap<>();
        preSum.put(0L, 1);

        return dfs(root, preSum, targetSum, 0);
    }

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

        // res表示以当前节点为根节点的二叉树的节点做路径末尾,有多少符合要求的路径
        int res = 0;

        cur += root.val;
        res += preSum.getOrDefault(cur - targetSum, 0);
        preSum.put(cur, preSum.getOrDefault(cur, 0) + 1);
        res += dfs(root.left, preSum, targetSum, cur);
        res += dfs(root.right, preSum, targetSum, cur);
        preSum.put(cur, preSum.get(cur) - 1);

        return res;
    }
}

总结

计算前缀和,二叉树中前缀和定义为当前节点一直到根节点的路径上所有节点之和,那么两节点的前缀和相减得到的结果便是两节点之间的路径和。

按照这个思路,我们对二叉树进行深度优先遍历,在遍历过程中将节点的前缀和存储起来。对于当前节点的前缀和cur,查询是否存在cur - targetSum前缀和。

相关推荐
Java内核笔记10 分钟前
万字避坑!Spring Boot 3.x 升 4.0 最全升级指南(附 Migration Checklist,建议收藏⭐)
java·后端
从零开始的代码生活_12 分钟前
C++ list 原理与实践:双向链表、迭代器与简化实现
开发语言·c++·后端·学习·算法·链表·list
cfm_29141 小时前
SpringBoot启动原理
java·spring boot·spring
ttod_qzstudio1 小时前
【软考算法】软件设计师下午第四题之动态规划:0-1 背包与最长公共子序列的“填表艺术“
算法·动态规划·软考
柒和远方1 小时前
LeetCode 139. 单词拆分 —— 从暴力回溯到 DP 完全背包
javascript·python·算法
漫随流水2 小时前
Java——springboot web案例
java·开发语言·spring boot
从此以后自律2 小时前
Java Object 类常用方法全讲解
java·开发语言
念何架构之路2 小时前
Docker 容器状态机 学习
java·学习·docker
你有我备注吗2 小时前
SQL学习之查询
java·sql·学习
从零开始的代码生活_2 小时前
C++ stack、queue 与 priority_queue:容器适配器原理与实战
开发语言·c++·后端·学习·算法