【Hot100】LeetCode—437. 路径总和 III

目录

  • [1- 思路](#1- 思路)
  • [2- 实现](#2- 实现)
    • [⭐437. 路径总和 III------题解思路](#⭐437. 路径总和 III——题解思路)
  • [3- ACM 实现](#3- ACM 实现)


1- 思路

前缀和+哈希表+dfs

① 前缀和

  • 求二叉树的前缀和,每求一次用一个 sum 传参记录更新

② 哈希表

  • key 为前缀和 ,value 为出现频率
  • 用来记录前缀和出现的次数,原理就是如果 sum - targetSum 在前缀和的哈希中,则证明有目标和为 targetSum 的路径。出现次数就是该哈希出现的次数

③ dfs递归三部

  • 3.1 参数返回值,返回 void,参数为 sumroot
  • 3.2 终止条件,遇到 null 直接返回
  • 3.3 递归处理:递归求前缀和,如果哈希表存在sum - targetSum且出现次数大于等于 1 ,收集 res
    • 更新 sum
    • 递归 左节点
    • 递归 右结点
    • 回溯 更新 sum

2- 实现

⭐437. 路径总和 III------题解思路

java 复制代码
class Solution {
    int targetSum;
    int res = 0;
    HashMap<Long,Integer> hash = new HashMap<>();
    public int pathSum(TreeNode root, int targetSum) {
        this.targetSum = targetSum;
        hash.put(0L,1);
        dfs(0L,root);
        return res;
    }

    public void dfs(Long sum,TreeNode root){
        // 终止
        if(root==null){
            return;
        }
        // 递归
        sum+=root.val;
        if(hash.containsKey(sum-targetSum) && hash.get(sum-targetSum)>=1){
            res += hash.get(sum-targetSum);
        }
        hash.put((Long)sum,hash.getOrDefault(sum,0)+1);
        dfs(sum,root.left);
        dfs(sum,root.right);
        hash.put((Long)sum,hash.get(sum)-1);
    }
}

3- ACM 实现

java 复制代码
package Daily_LC.Month8_Week4.Day138;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * pathSum
 *
 * @author alcohol
 * @Description
 * @since 2024-08-24 13:40
 */
public class pathSum {

    public static 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;
        }
    }

    public static TreeNode build(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }
        String input = str.replace("[", "");
        input = input.replace("]", "");
        String[] parts = input.split(",");

        Integer[] nums = new Integer[parts.length];
        for (int i = 0; i < parts.length; i++) {
            if (!parts[i].equals("null")) {
                nums[i] = Integer.parseInt(parts[i]);
            } else {
                nums[i] = null;
            }
        }
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(nums[0]);
        queue.offer(root);
        int index = 1;
        while (!queue.isEmpty() && index < parts.length) {
            TreeNode node = queue.poll();
            if (index < nums.length && nums[index] != null) {
                node.left = new TreeNode(nums[index]);
                queue.offer(node.left);
            }
            index++;
            if (index < nums.length && nums[index] != null) {
                node.right = new TreeNode(nums[index]);
                queue.offer(node.right);
            }
            index++;
        }
        return root;
    }


    static int res = 0;
    static HashMap<Long, Integer> hash = new HashMap<>();

    public static int pathSum(TreeNode root, int targetSum) {

        hash.put(0L, 1);
        dfs(0L, root, targetSum);
        return res;
    }

    public static void dfs(Long sum, TreeNode root, int targetSum) {
        // 终止
        if (root == null) {
            return;
        }
        // 递归
        sum += root.val;
        if (hash.containsKey(sum - targetSum) && hash.get(sum - targetSum) >= 1) {
            res += hash.get(sum - targetSum);
        }
        hash.put((Long) sum, hash.getOrDefault(sum, 0) + 1);
        dfs(sum, root.left, targetSum);
        dfs(sum, root.right, targetSum);
        hash.put((Long) sum, hash.get(sum) - 1);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        TreeNode root = build(input);
        System.out.println("输入目标和");
        int targetSum = sc.nextInt();
        pathSum(root, targetSum);
        System.out.println("结果是" + res);
    }

}
相关推荐
何其有幸.5 小时前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
东阳马生架构6 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
老饼讲解-BP神经网络7 小时前
一篇入门之-评分卡变量分箱(卡方分箱、决策树分箱、KS分箱等)实操例子
算法·决策树·机器学习
何其有幸.7 小时前
实验6-3 使用函数求特殊a串数列和(PTA|C语言)
c语言·数据结构·算法
不会计算机的捞地7 小时前
【数据结构入门训练DAY-24】美国大选
数据结构·算法
明月看潮生7 小时前
青少年编程与数学 02-018 C++数据结构与算法 11课题、分治
c++·算法·青少年编程·编程与数学
Echo``8 小时前
2:QT联合HALCON编程—图像显示放大缩小
开发语言·c++·图像处理·qt·算法
.似水8 小时前
2025.4.22_C_可变参数列表
java·c语言·算法
Felven8 小时前
A. Ideal Generator
java·数据结构·算法
IT成长日记8 小时前
【Hive入门】Hive分桶表深度解析:从哈希分桶到Join优化的完整指南
hive·hadoop·哈希算法·哈希分桶·join优化