news 2026/9/5 16:01:37

力扣112. 路径总和:递归DFS vs 迭代BFS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣112. 路径总和:递归DFS vs 迭代BFS

题目描述

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

示例:

给定如下二叉树,以及目标和 sum = 22 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1 返回 true,因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

解法一:递归DFS(深度优先搜索)

核心思想

采用深度优先搜索策略,从根节点开始递归遍历每条路径。每次递归时,用目标和减去当前节点的值,当到达叶子节点时判断剩余值是否等于叶子节点的值。

代码实现

class Solution { public boolean hasPathSum(TreeNode root, int targetSum) { // 空节点直接返回false if (root == null) { return false; } // 如果是叶子节点,判断当前值是否等于剩余的targetSum if (root.left == null && root.right == null) { return targetSum == root.val; } // 递归检查左右子树 return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val); } }

算法流程

  1. 检查当前节点是否为空,空节点返回false

  2. 如果是叶子节点(左右子节点都为空),判断targetSum == root.val

  3. 如果不是叶子节点,递归检查左右子树,更新targetSum = targetSum - root.val

  4. 左右子树任意一条路径满足条件即返回true

复杂度分析

  • 时间复杂度:O(N),每个节点访问一次

  • 空间复杂度:O(H),递归栈的深度为树的高度H,最坏情况O(N)

解法二:迭代BFS(广度优先搜索)

核心思想

使用队列进行广度优先遍历,同时维护从根节点到当前节点的路径和。通过两个队列(一个存储节点,一个存储路径和)实现同步遍历。

代码实现

class Solution { public boolean hasPathSum(TreeNode root, int sum) { if (root == null) return false; Queue<TreeNode> nodeQueue = new LinkedList<>(); Queue<Integer> valueQueue = new LinkedList<>(); nodeQueue.offer(root); valueQueue.offer(root.val); while (!nodeQueue.isEmpty()) { TreeNode currentNode = nodeQueue.poll(); int currentSum = valueQueue.poll(); // 如果是叶子节点,检查路径和 if (currentNode.left == null && currentNode.right == null) { if (currentSum == sum) return true; continue; } // 将子节点和新的路径和加入队列 if (currentNode.left != null) { nodeQueue.offer(currentNode.left); valueQueue.offer(currentSum + currentNode.left.val); } if (currentNode.right != null) { nodeQueue.offer(currentNode.right); valueQueue.offer(currentSum + currentNode.right.val); } } return false; } }

算法流程

  1. 初始化两个队列,分别存储节点和对应的路径和

  2. 将根节点和其值加入队列

  3. 循环处理队列中的元素:

    • 取出节点和对应的路径和

    • 如果是叶子节点,检查路径和是否等于目标值

    • 如果不是叶子节点,将子节点及新的路径和加入队列

  4. 遍历完所有节点后未找到返回false

复杂度分析

  • 时间复杂度:O(N),每个节点访问一次

  • 空间复杂度:O(N),队列最多存储所有节点

两种解法的对比

特性递归DFS迭代BFS
实现方式递归调用队列迭代
遍历顺序深度优先广度优先
空间复杂度O(H),H为树高度O(N),最坏情况
代码简洁性简洁优雅相对复杂
栈溢出风险树很深时可能溢出无递归栈溢出风险
适用场景树较平衡时树很宽或需要避免递归时

关键点总结

1. 叶子节点的判断

两种解法都必须正确处理叶子节点的判断:只有当节点的左右子节点都为空时,才是叶子节点。

2. 路径和的计算

  • DFS:通过递归参数传递更新后的目标值(targetSum - node.val)

  • BFS:通过第二个队列存储从根节点到当前节点的累计和

3. 边界条件处理

  • 空树(root == null)直接返回false

  • 单节点树需要作为叶子节点处理

常见错误

  1. 忽略叶子节点判断:将中间节点的路径和误判为满足条件

    // 错误示例 if (targetSum == 0) return true; // 可能在中途节点就满足了
  2. 未正确处理空节点:对空节点进行.val操作会导致空指针异常

  3. 未更新目标值:在递归或迭代时忘记减去当前节点的值

扩展思考

如何返回所有满足条件的路径?

如果需要返回所有路径而不仅仅是判断是否存在,可以使用回溯法:

public List<List<Integer>> pathSum(TreeNode root, int targetSum) { List<List<Integer>> result = new ArrayList<>(); List<Integer> path = new ArrayList<>(); dfs(root, targetSum, path, result); return result; }

如何统计路径数量?

如果只需要统计路径数量而不需要具体路径,可以简化递归逻辑。

结语

路径总和问题是一个经典的二叉树遍历问题,它很好地展示了DFS和BFS在树结构中的应用。理解并掌握这两种解法有助于解决更复杂的树形路径问题,如:

  • LeetCode 113. 路径总和 II(返回所有路径)

  • LeetCode 437. 路径总和 III(统计路径数量)

  • LeetCode 129. 求根节点到叶节点数字之和

掌握递归思维和迭代思维在算法解题中同等重要,根据具体问题选择合适的方法往往能事半功倍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 16:00:47

MinerU制药研发记录:GMP合规性检查辅助工具案例

MinerU制药研发记录&#xff1a;GMP合规性检查辅助工具案例 1. 引言&#xff1a;当AI遇上制药文档管理 在制药行业的研发过程中&#xff0c;实验记录、工艺流程、质量控制文件等PDF文档数量庞大&#xff0c;格式复杂。这些文档往往包含多栏排版、化学结构式、数据表格和图表&…

作者头像 李华
网站建设 2026/9/3 13:16:19

Qwen All-in-One自动化流水线:CI/CD集成实战

Qwen All-in-One自动化流水线&#xff1a;CI/CD集成实战 1. 项目背景与核心价值 你有没有遇到过这样的场景&#xff1a;想在一台低配服务器上部署一个能聊天、又能判断用户情绪的AI助手&#xff0c;结果发现光是装模型就卡住了&#xff1f;下载BERT做情感分析&#xff0c;再装…

作者头像 李华
网站建设 2026/9/3 19:22:21

实时语音合成可行吗?Sambert流式输出功能开发与部署

实时语音合成可行吗&#xff1f;Sambert流式输出功能开发与部署 1. Sambert多情感中文语音合成&#xff1a;开箱即用的工业级方案 你有没有遇到过这样的场景&#xff1a;需要为一段长文本快速生成自然流畅的中文语音&#xff0c;比如制作有声书、智能客服播报&#xff0c;或者…

作者头像 李华
网站建设 2026/9/4 0:08:00

非常规 PostgreSQL 优化技巧在 PostgreSQL 中加速查询的创造性思路

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

作者头像 李华
网站建设 2026/9/5 2:05:01

Zotero PDF2zh:开启学术翻译的智能革命

Zotero PDF2zh&#xff1a;开启学术翻译的智能革命 【免费下载链接】zotero-pdf2zh PDF2zh for Zotero | Zotero PDF中文翻译插件 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf2zh 还在为海量英文文献的阅读效率而苦恼吗&#xff1f;传统翻译方式带来的格式…

作者头像 李华
网站建设 2026/9/4 0:31:18

Shairport4w完整使用教程:三步让Windows变身AirPlay音频接收器

Shairport4w完整使用教程&#xff1a;三步让Windows变身AirPlay音频接收器 【免费下载链接】Shairport4w An AirPlay Audio-Receiver for your Windows-PC 项目地址: https://gitcode.com/gh_mirrors/sh/Shairport4w 想要将iPhone或iPad的音乐无线传输到Windows电脑播放…

作者头像 李华