leetcode热题路径总和 III

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

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

示例 1:

复制代码
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。
java 复制代码
    public int pathSum(TreeNode root, long targetSum) {
        if (root == null) {
            return 0;
        }
        int count = rootSum(root, targetSum);
        count += pathSum(root.left,targetSum);
        count += pathSum(root.right,targetSum);
        return count;

    }

    private int rootSum(TreeNode root, long targetSum) {
        int ret = 0;
        if (root == null) {
            return ret;
        }
        int val = root.val;
        if (val == targetSum) {
            ret++;
        }
        ret += rootSum(root.left, targetSum - val);
        ret += rootSum(root.right, targetSum -val);
        return ret;
    }


    // 前辍和
    public int pathSum1(TreeNode root, long targetSum) {
        Map<Long, Integer> prefix = new HashMap<>();
        prefix.put(0L,1);
        return rootDfs(root,prefix,0,targetSum);

    }



    /**
     *
     * @param root
     * @param prefix
     * @param curr
     * @param targetSum
     * @return
     * des  先序遍历递归,往map里不断放入当前节点到根节点的和,并不断从map里取出前辍和是否等于当前节点和-targetSum,如有则找到一条,当我们退出当前节点时,
     * 我们需要及时更新已经保存的前辍和,如果不更新,后续其他分支的前辍和可能一样,就导致了重复计算
     */
    private int rootDfs(TreeNode root, Map<Long, Integer> prefix, long curr, long targetSum) {
        int ret = 0;
        if (root == null) {
            return ret;
        }
        curr += root.val;
        ret = prefix.getOrDefault(curr - targetSum, 0);
        ret += rootDfs(root.left, prefix, curr, targetSum);
        ret += rootDfs(root.right, prefix, curr, targetSum);
        prefix.put(curr, prefix.getOrDefault(curr, 0) - 1);
        return ret;
    }
相关推荐
智者知已应修善业4 分钟前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
AC赳赳老秦20 分钟前
OpenClaw 助力技术面试:自动生成面试题、模拟面试、整理面试知识点
开发语言·python·面试·职场和发展·自动化·deepseek·openclaw
8Qi830 分钟前
LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法
java·算法·leetcode·职场和发展·二分查找
林间码客32 分钟前
智能旅行规划助手 — 实习面试问答手册
面试·职场和发展
8Qi834 分钟前
LeetCode 32:最长有效括号 —— 栈 + 标记法 题解
java·数据结构·算法·leetcode·职场和发展··括号匹配
机器学习之心36 分钟前
198种组合算法+优化CNN-LSTM+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备
深度学习·算法·cnn-lstm·shap分析·198种组合算法
Tairitsu_H37 分钟前
[LC优选算法#3] 滑动窗口 | 将x减到0的最⼩操作数 | ⽔果成篮 | 字⺟异位词
c++·算法·leetcode·滑动窗口
bIo7lyA8v44 分钟前
算法复杂度与能耗关系的多变量分析研究的技术8
算法
浮午1 小时前
腾讯AI应用开发一面实录:13道硬核面试题全解析
人工智能·面试·职场和发展
洛水水1 小时前
【力扣100题】76.搜索插入位置
数据结构·算法·leetcode