二叉树:路径总和

128 阅读1分钟

leetcode:437. 路径总和 III

题目描述

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

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

示例

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

解题思路

前缀和

先序遍历,从根节点出发 方向从上向下,将累加和sum存入map。那么节点node1到节点node2之间累加和就可以表示为sum2 - sum1

回溯

在走完一条路径之后,减去最后一个节点的val 同时map去除这条路径,避免错误的累加和被判断为路径和 影响前缀和的处理。

下面,12是正确的路径,3是没有回溯导致的错误路径记录。 image.png

回溯的时机应该是处理完所有的子节点后进行回溯,递归回溯当前路径的最后一个节点,保证左子树的前缀和不会交叉到右子树处理。

完整代码:

class Solution {
    int cnt;
    Map<Long, Integer> map;

    public int pathSum(TreeNode root, int targetSum) {
        cnt = 0;
        map = new HashMap<>();
        map.put(0L, 1);
        dfs(root, targetSum, 0);
        return cnt;
    }

    void dfs(TreeNode node, int target, long sum) {
        if (null == node) return;

        sum += node.val;
        cnt += map.getOrDefault(sum - target, 0);
        map.put(sum, map.getOrDefault(sum, 0) + 1);

        dfs(node.left, target, sum);

        dfs(node.right, target, sum);
        
        map.put(sum, map.get(sum) - 1);
        sum -= node.val;
    }
}