当前位置: 首页 > news >正文

LeetCode 113. Path Sum II 题解

LeetCode 113. Path Sum II 题解

题目描述

给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。

叶子节点是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

输入:root = [1,2,3], targetSum = 5 输出:[]

示例 3:

输入:root = [1,2], targetSum = 0 输出:[]

解题思路

方法:深度优先搜索(DFS)+ 回溯

思路

  • 使用深度优先搜索遍历二叉树
  • 记录当前路径和当前路径的和
  • 当到达叶子节点时,检查当前路径的和是否等于目标和
  • 如果等于,将当前路径加入结果列表
  • 使用回溯法,在递归返回时移除当前节点,以便探索其他路径

复杂度分析

  • 时间复杂度:O(n²),其中 n 是二叉树的节点个数。每个节点只被访问一次,但是需要复制路径,最坏情况下路径长度为 O(n)。
  • 空间复杂度:O(n),递归调用的栈空间取决于二叉树的深度,最坏情况下为 O(n)。

代码实现

方法:深度优先搜索(DFS)+ 回溯

# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: result = [] path = [] def dfs(node, current_sum): if not node: return # 将当前节点加入路径 path.append(node.val) current_sum += node.val # 检查是否是叶子节点且路径和等于目标和 if not node.left and not node.right and current_sum == targetSum: result.append(path.copy()) # 递归搜索左子树和右子树 dfs(node.left, current_sum) dfs(node.right, current_sum) # 回溯:移除当前节点 path.pop() dfs(root, 0) return result

测试用例

测试用例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

测试用例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]

测试用例 3:

输入:root = [1,2], targetSum = 0
输出:[]

总结

本题是二叉树的经典问题,主要考察对二叉树遍历和回溯的理解和应用。通过使用深度优先搜索和回溯,我们可以高效地找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

深度优先搜索的核心思想是:遍历二叉树,记录当前路径和当前路径的和,当到达叶子节点时,检查路径和是否等于目标和。回溯的核心思想是:在递归返回时移除当前节点,以便探索其他路径。

这种方法不仅适用于路径总和 II 问题,还可以应用于许多其他需要遍历二叉树并记录路径的场景。掌握深度优先搜索和回溯的思想,对于解决这类问题非常重要。

http://www.jsqmd.com/news/593353/

相关文章:

  • GORM实战避坑指南:从官方文档到高效开发
  • 基于Arduino的智能台灯: 调整亮度,检测人体,测距 确保代码好用和原理图,红外测有没有人
  • 2025届最火的十大AI学术网站推荐
  • 迪文T5L屏幕RS485通信实战:从调试失败到成功发送的完整记录
  • FPGA SDIO模式SD卡读写源码(可移植至任意FPGA,读写速率50Mbps+)
  • STM32 AES256加密串口IAP升级Bootloader程序与上位机软件全套资料获取说明...
  • 7-Zip开源压缩工具完全指南:高效文件压缩与管理解决方案
  • Linux内核中的虚拟化支持技术
  • ALOHA开源双臂机器人系统全攻略:从核心价值到深度实践
  • LeetCode 199. Binary Tree Right Side View 题解
  • 从过热保护到精准限流:用Multisim拆解一个线性电源的‘安全卫士’电路(TL431+运放实战)
  • Xilinx Ultrascale系列I/ODELAYE3级联优化策略与实战解析
  • Ollama环境变量全解析:除了OLLAMA_GPU_LAYER,这些参数也能大幅提升你的模型运行效率
  • 基于光伏出力利用率的电动汽车充电站能量调度策略:动态评估充放电灵活性,优化准入规则与电价制定...
  • Dual-Loop Adaptive AI System Whitepaper(DLAAS)双环自适应AI系统正式命名白皮书
  • Linux内核中的工作队列机制:异步任务处理的基石
  • COMSOL模拟:电磁超声压电接收技术在铝板裂纹检测中的应用
  • 程序员不用患上AI焦虑症
  • 深入解析字符串处理函数与printf的实现原理
  • GetQzonehistory:如何一键完整导出QQ空间所有说说的终极指南
  • 基于模型预测算法的微网双层能量管理模型:考虑储能优化与电池退化成本的全寿命周期仿真
  • Linux内核中的PREEMPT_RT实时补丁详解
  • Windows下用Fiddler+夜神模拟器抓取APP数据包完整指南(附证书配置避坑技巧)
  • 直流有刷电机闭环控制:主控DSP28335的AB编码器速度闭环系统
  • 基于DDPG算法的发电公司竞价策略代码逐逐段解读说明
  • 传统永磁同步电机的FOC离散化simulink模型,效果较好 附赠传递函数离散化推导的文档
  • 【实战指南】华为Atlas200 DK与电脑双通道连接:USB与网线方案全解析
  • python binascii
  • 告别云端API!用C#调用微信本地OCR,5分钟搞定扫描件文字提取
  • Linux内核中的Completion机制:同步等待的艺术