跟着小码学算法Day19:路径总和

一、算法思想:递归+回溯

1. 递归(DFS 深度优先搜索)

核心思想:

  • 从根开始,每往下走一层,就从 targetSum 中减去当前节点的值。
  • 到达叶子节点时,检查剩余的 targetSum 是否等于 0。
  • 如果等于 0,说明找到了一条满足条件的路径。

2. 递推方式(减法思想)

我们不维护路径和,而是不断 缩小目标值

复制代码
newTarget = targetSum - root.val

然后递归地在子树中查找是否存在和为 newTarget 的路径。

口诀: "递归减目标,叶节点判零,左右任一真,整体就为真。"


二、解题模板

java 复制代码
public boolean hasPathSum(TreeNode root, int targetSum) {
    // 空节点,无路径
    if (root == null) {
        return false;
    }

    // 到达叶子节点,判断剩余目标是否等于当前节点值
    if (root.left == null && root.right == null) {
        return targetSum == root.val;
    }

    // 递归检查左子树或右子树
    return hasPathSum(root.left, targetSum - root.val) ||
           hasPathSum(root.right, targetSum - root.val);
}

三、典型例题

112. 路径总和 - 力扣(LeetCode)

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 boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null){
            return false;
        }
        targetSum-=root.val;

        if(root.left==null && root.right==null){
            return targetSum==0;
        }

        if(root.left!=null){
            boolean left = hasPathSum(root.left,targetSum);
            if(left){
                return true;
            }
        }
        if(root.right!=null){
            boolean right = hasPathSum(root.right,targetSum);
            if(right){
                return true;
            }
        }

        return false;
    }
}
相关推荐
csdn_aspnet4 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
Dicky-_-zhang4 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨4 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
fake_ss1984 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
谙弆悕博士4 小时前
【附C源码】从零实现C语言堆数据结构:原理、实现与应用
c语言·数据结构·算法··数据结构与算法
茉莉玫瑰花茶4 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁4 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮5 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu12335 小时前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言