暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【每日一题】437. 路径总和 III:前缀和 & 图解 & 回溯!

彤哥来刷题啦 2021-09-28
1252

今天是我坚持写题解的第 55 天!

题目描述(Medium)

给定一个二叉树的根节点 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]
-10^9 <= Node.val <= 10^9
-1000 <= targetSum <= 1000

复制

链接:https://leetcode-cn.com/problems/path-sum-iii

方法、前缀和

今天这道题我们可以使用前缀和来求解,比如,给定数据为:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
,对应的二叉树及其前缀和为:

image-20210928102600885

有了前缀和,我们只要在每一条路径上求解:两个节点之差等于 targetSum
,即可。

为了更快速的找到某个数值在路径中是否出现过,我们可以使用哈希表记录路径中每个数值出现的次数,比如,上图中哈希表中记录了 10
这个数值,当遍历到 18
时,发现哈希表中有 18 - 8 = 10
,总次数加上 10
出现的次数即可。

另外,为了处理包含根节点的情况,我们需要在哈希表中存储一个 (0,1)
的键值对。

而且,我们并不需要一开始就把前缀和树计算出来,我们可以边遍历边计算,这里使用回溯来处理。

请看代码:

class Solution {

    int ans = 0;

    public int pathSum(TreeNode root, int targetSum) {
        // 记录路径中某个前缀和出现的次数
        Map<Integer, Integer> map = new HashMap<>();
        // 防止包含根节点的时候找不到
        map.put(01);
        // 开始搜索
        dfs(root, map, 0, targetSum);
        // 返回值
        return ans;
    }

    private void dfs(TreeNode node, Map<Integer, Integer> map, int currSum, int targetSum) {
        // 递归退出条件
        if (node == null) {
            return;
        }

        // 判断是否存在符合条件的前缀和
        currSum += node.val;
        ans += map.getOrDefault(currSum - targetSum, 0);

        // 将当前前缀和记录下来
        map.put(currSum, map.getOrDefault(currSum, 0) + 1);

        // 继续往下递归
        dfs(node.left, map, currSum, targetSum);
        dfs(node.right, map, currSum, targetSum);

        // 回溯,恢复状态
        map.put(currSum, map.getOrDefault(currSum, 0) - 1);
    }
}

复制
  • 时间复杂度:,每个节点只遍历一次。
  • 空间复杂度:,递归栈占用的空间与树的高度成正比,这里没说是平衡二叉树,所以并不一定是 。map占用的空间为不同数值的前缀和,可以理解为与 成正比。

运行结果如下:

image-20210928102102141

最后

如果对你有帮助,请点个赞吧,谢谢^^

也可以关注我,每日分享题解,一起刷题,一起拿全家桶。

文章转载自彤哥来刷题啦,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论