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…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...