Leetcode 112: 路径总和
Leetcode 112: 路径总和
问题描述:
给定一个二叉树的根节点 root 和一个目标和 targetSum,判断是否存在从根节点到叶子节点的路径,使路径上所有节点的值相加等于目标和 targetSum。
适合面试的解法:递归
解法特点:
- 递归是解决路径和问题的最优实现方式,利用二叉树的递归性质逐步处理每条可能的路径。
- 对每个节点,递归减去当前节点的值,直到叶子节点时检查剩余的
targetSum是否为零。 - 时间复杂度 (O(n)),空间复杂度 (O(h))((h) 为树的高度,递归栈的深度),非常适合面试场景。
解法思路
核心步骤:
-
递归分治:
- 当前节点的路径总和,由其左子树和右子树是否有满足条件的路径决定。
- 每次递归将
targetSum减去当前节点的值,抵达叶子时检查剩余的和。
-
判断叶子节点:
- 如果当前节点是叶子节点(无左子节点也无右子节点),同时路径总和符合
targetSum,返回true。
- 如果当前节点是叶子节点(无左子节点也无右子节点),同时路径总和符合
-
递归终止条件:
- 如果当前节点为
null,返回false。 - 叶子节点时检查
targetSum是否与节点值相等。
- 如果当前节点为
-
最终逻辑:
- 对每个节点,递归判断它的左子树和右子树是否满足条件。
代码模板:递归法
class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// Step 1: 如果节点为空,返回 falseif (root == null) {return false;}// Step 2: 如果节点是叶子节点,检查是否路径总和满足条件if (root.left == null && root.right == null) {return root.val == targetSum;}// Step 3: 减去当前节点值,从左右子树递归查找路径和int remainingSum = targetSum - root.val;return hasPathSum(root.left, remainingSum) || hasPathSum(root.right, remainingSum);}
}
代码详细注释
class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// Step 1: 递归终止条件// 如果当前节点为 null,没有路径可以满足条件,返回 falseif (root == null) {return false;}// Step 2: 检查叶子节点// 如果当前节点是叶子节点(无左右子节点),检查路径总和是否满足 targetSumif (root.left == null && root.right == null) {return root.val == targetSum; // 如果满足条件,返回 true}// Step 3: 递归处理子树// 更新剩余的路径总和,递归查找左右子树int remainingSum = targetSum - root.val;boolean leftResult = hasPathSum(root.left, remainingSum); // 检查左子树路径总和boolean rightResult = hasPathSum(root.right, remainingSum); // 检查右子树路径总和// Step 4: 返回结果// 如果任意一个子树满足路径总和条件,返回 truereturn leftResult || rightResult;}
}
复杂度分析
时间复杂度:
- 每个节点最多被访问一次,时间复杂度为 (O(n)),其中 (n) 是树的节点总数。
空间复杂度:
- 递归栈的深度与树的高度相关:
- 平衡二叉树的高度为 (O(\log n)),空间复杂度为 (O(\log n))。
- 完全不平衡二叉树(链表状)的高度为 (O(n)),空间复杂度为 (O(n))。
测试用例
示例 1:
输入:
root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:
true
解释:
从根节点到叶子节点的一条路径 5 → 4 → 11 → 2 的总和等于 22。
示例 2:
输入:
root = [1,2,3], targetSum = 5
输出:
false
解释:
树中任意路径的总和都不等于 5。
示例 3:
输入:
root = [], targetSum = 0
输出:
false
如何快速 AC(面试技巧)
1. 树的递归分治思想:
- 每个节点的路径和问题可以归结为子树的路径和问题,递归很自然地处理二叉树。
2. 判断叶子节点的条件:
- 特别强调叶子节点的判断逻辑:必须满足“无左右子节点”且“路径和符合目标 sum”。
3. 时间复杂度分析:
- (O(n)):每节点访问一次,这是二叉树递归常见的复杂度。
- 空间复杂度根据树的高度合理优化。
4. 全局逻辑清晰表达:
- 用递归逻辑分解问题,每一层会贡献新的
targetSum(剩余路径和)。
其他解法
方法 2:迭代法(使用栈)
思路:
- 使用栈实现递归的效果,根据路径累加值判断是否符合
targetSum。
代码模板:
import java.util.*;class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {if (root == null) return false; // 如果树为空,直接返回 false// 初始化栈,用于模拟递归逻辑Stack<TreeNode> nodeStack = new Stack<>();Stack<Integer> sumStack = new Stack<>();nodeStack.push(root);sumStack.push(targetSum);// 遍历节点while (!nodeStack.isEmpty()) {TreeNode currentNode = nodeStack.pop();int currentSum = sumStack.pop() - currentNode.val;// 如果是叶子节点,检查路径是否满足条件if (currentNode.left == null && currentNode.right == null && currentSum == 0) {return true;}// 将左右子节点入栈(更新路径和)if (currentNode.right != null) {nodeStack.push(currentNode.right);sumStack.push(currentSum);}if (currentNode.left != null) {nodeStack.push(currentNode.left);sumStack.push(currentSum);}}return false;}
}
对比递归与迭代
| 解法 | 时间复杂度 | 空间复杂度 | 适用场景 |
|---|---|---|---|
| 递归法 | (O(n)) | (O(h)) | 简单树结构,逻辑直观 |
| 迭代法 | (O(n)) | (O(h))(栈存储) | 深度较大的树,避免递归栈溢出 |
推荐解法:递归法
适合面试场景:
- 递归法易于实现,逻辑直观,时间复杂度和空间复杂度表现良好。
总结:如何快速 AC?
- 使用递归实现,树的递归逻辑清晰。
- 判断叶子节点时,特别强调路径和条件。
- 时间复杂度和空间复杂度分析简洁明了,边界处理完整。
通过递归方法,你可以快速实现并解决问题,同时展示对二叉树递归的掌握,非常适合面试场景!
相关文章:
Leetcode 112: 路径总和
Leetcode 112: 路径总和 问题描述: 给定一个二叉树的根节点 root 和一个目标和 targetSum,判断是否存在从根节点到叶子节点的路径,使路径上所有节点的值相加等于目标和 targetSum。 适合面试的解法:递归 解法特点: …...
华为云IAM 用户名和IAM ID
账号 当您首次使用华为云时注册的账号,该账号是您的华为云资源归属、资源使用计费的主体,对其所拥有的资源及云服务具有完全的访问权限,可以重置用户密码、分配用户权限等。账号统一接收所有IAM用户进行资源操作时产生的费用账单。 账号不能…...
Compose Multiplatform+Kotlin Multiplatfrom 第四弹跨平台
文章目录 引言功能效果开发准备依赖使用gradle依赖库MVIFlow设计富文本显示 总结 引言 Compose Multiplatformkotlin Multiplatfrom 今天已经到compose v1.7.3,从界面UI框架上实战开发看,很多api都去掉实验性注解,表示稳定使用了!…...
【Proteus仿真】【STM32单片机】全自动养护智能生态雨林缸
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用按键、LCD1602液晶、DS18B20模块、PCF8591 ADC、浑浊传感器、PH传感器、液位传感器、继电器、水泵、酸碱调节剂、加热降温装置等。 主要功能&am…...
GBT32960 协议编解码器的设计与实现
GBT32960 协议编解码器的设计与实现 引言 在车联网领域,GBT32960 是一个重要的国家标准协议,用于新能源汽车与监控平台之间的数据交互。本文将详细介绍如何使用 Rust 实现一个高效可靠的 GBT32960 协议编解码器。 整体架构 编解码器的核心由三个主要组…...
SolidWorks 转 PDF3D 技术详解
在现代工程设计与制造流程中,不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式,能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项,…...
OpenMCU(二):GD32E23xx FreeRTOS移植
概述 本文主要描述了GD32E230移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程,该工程已经下载放好了移植GD32E230 FreeRTOS的所有文件 OpenMCU_FreeRTOS工程…...
Codeforces Round 835 (Div. 4)题解ABCDEFG
Problem - A - Codeforces 题意:你有 t 组数据,每组有两两不同的三个数 a,b,c,现在需要你求出他们的中位数。 思路:模拟即可 // Code Start Here int t;cin >> t;while(t--){vector<int> a(3);for(int i 0;i<3…...
NO1.C++语言基础|四种智能指针|内存分配情况|指针传擦和引用传参|const和static|c和c++的区别
1. 说⼀下你理解的 C 中的四种智能指针 智能指针的作用是管理指针,可以避免内存泄漏的发生。 智能指针就是一个类,当超出了类的作用域时,就会调用析构函数,这时就会自动释放资源。 所以智能指针作用的原理就是在函数结束时自动释…...
SQLite Having 子句详解
SQLite Having 子句详解 引言 SQLite 是一款轻量级的数据库管理系统,广泛应用于移动设备、嵌入式系统和各种桌面应用程序。在 SQL 查询中,HAVING 子句是用于过滤结果集的关键部分,尤其是在使用 GROUP BY 子句进行分组操作时。本文将详细解析 SQLite 中的 HAVING 子句,包括…...
Python数据分析面试题及参考答案
目录 处理 DataFrame 中多列缺失值的 5 种方法 批量替换指定列中的异常值为中位数 使用正则表达式清洗电话号码格式 合并两个存在部分重叠列的 DataFrame 将非结构化 JSON 日志转换为结构化表格 处理日期列中的多种非标准格式(如 "2023 年 12 月 / 05 日") 识…...
Spring Boot 3 整合 MinIO 实现分布式文件存储
引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心,而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…...
ubuntu20 安装python2
1. 确保启用了 Universe 仓库 在某些情况下,python2-minimal 包可能位于 Universe 仓库中。你可以通过以下命令启用 Universe 仓库并更新软件包列表: bash复制 sudo add-apt-repository universe sudo apt update 然后尝试安装: bash复制…...
2025.3.3总结
周一这天,我约了绩效教练,主要想了解专业类绩效的考核方式以及想知道如何拿到一个更好的绩效。其他的岗位并不是很清楚,但是专业类的岗位,目前采取绝对考核,管理层和专家岗采取相对考核,有末尾淘汰。 通过…...
多线程-JUC源码
简介 JUC的核心是AQS,大部分锁都是基于AQS扩展出来的,这里先结合可重入锁和AQS,做一个讲解,其它的锁的实现方式也几乎类似 ReentrantLock和AQS AQS的基本结构 AQS,AbstractQueuedSynchronizer,抽象队列…...
ICLR 2025|香港浸会大学可信机器学习和推理课题组专场
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! AITIME 01 ICLR 2025预讲会团队专场 AITIME 02 专场信息 01 Noisy Test-Time Adaptation in Vision-Language Models 讲者:曹晨涛,HKBU TMLR Group一年级博士生,目前关注基础…...
docker引擎备份及解决拉取失败的问题
总结一下本文,docker引擎不是越多越好,此外阿里云的容器引擎加速可适用大多数情况。 docker引擎备份 仅使用阿里云 docker引擎备份,唯一使用的镜像地址是我的阿里云docker镜像加速地址,效果好(注意下面的阿里云镜像加…...
Django项目实战
1、安装django 查看包安装的位置 pip镜像源 镜像源名称镜像地址清华源https://pypi.tuna.tsinghua.edu.cn/simple阿里云https://mirrors.aliyun.com/pypi/simple腾讯云https://mirrors.cloud.tencent.com/pypi/simple华为云https://repo.huaweicloud.co…...
【ThreeJS Basics 1-6】Camera
文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动(可以看到后面) 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…...
SpringBoot-模拟SSE对话交互
SpringBoot-模拟SSE对话交互 后端使用SSE进行会话,前端使用Html模拟大模型的问答交互->【前端】【后端】 1-学习目的 本项目代码仓库:https://gitee.com/enzoism/springboot_sse 1-核心知识点 1)什么是SSE协议->客户端发起一次请求&am…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
