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

LeetCode 112. 路径总和解题思路详解(BFS算法深入理解)

在刷LeetCode时,遇到了第112题"路径总和"(Path Sum)这道经典的二叉树题目。本文将详细解析使用广度优先搜索(BFS)解决该问题的思路和实现。

题目描述

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

解题思路

本解法采用广度优先搜索(BFS)的方式,通过两个队列分别维护节点和到达该节点的路径和:

1. 使用一个队列存储待访问的节点
2. 使用另一个队列存储从根节点到当前节点的路径和
3. 同时遍历两个队列,检查当前节点是否为叶子节点且路径和等于目标值

public class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// 如果根节点为空,直接返回falseif (root == null) {return false;}// 使用两个队列分别存储节点和到该节点的路径和Queue<TreeNode> nodeQueue = new LinkedList<>();Queue<Integer> sumQueue = new LinkedList<>();// 将起始节点和初始路径和放入队列nodeQueue.offer(root);sumQueue.offer(root.val);// 开始BFS遍历while (!nodeQueue.isEmpty()) {// 同时取出节点和对应的路径和TreeNode node_temp = nodeQueue.poll();Integer val_temp = sumQueue.poll();// 判断是否为叶子节点且路径和等于目标值if (val_temp != null && val_temp == targetSum && node_temp.left == null && node_temp.right == null) {return true;}// 处理左子节点TreeNode node_Left = node_temp.left;if (node_Left != null) {nodeQueue.offer(node_Left);sumQueue.offer(node_Left.val + val_temp);}// 处理右子节点TreeNode node_Right = node_temp.right;if (node_Right != null) {nodeQueue.offer(node_Right);sumQueue.offer(node_Right.val + val_temp);}}// 遍历完所有节点仍未找到符合条件的路径,返回falsereturn false;}
}


算法分析

时间复杂度
O(N):其中N是二叉树的节点数。在最坏情况下,我们需要访问二叉树的所有节点。
 空间复杂度
O(N):主要由两个队列的空间开销决定。在最坏情况下,队列中会存储接近N个节点的信息。

算法执行流程示例

假设我们有如下二叉树,目标和为22:


执行过程如下:
1. 初始状态:nodeQueue=[5], sumQueue=[5]
2. 第一次循环:取出5和5,5不是叶子节点,将子节点加入队列
    nodeQueue=[4, 8], sumQueue=[9, 13]
3. 第二次循环:取出4和9,4不是叶子节点,将子节点加入队列
    nodeQueue=[8, 11], sumQueue=[13, 20]
4. 第三次循环:取出8和13,8不是叶子节点,将子节点加入队列
    nodeQueue=[11, 13, 4], sumQueue=[20, 26, 17]
5. 第四次循环:取出11和20,11不是叶子节点,将子节点加入队列
    nodeQueue=[13, 4, 7, 2], sumQueue=[26, 17, 27, 22]
6. 第五次循环:取出13和26,13是叶子节点但和不等于22
7. 第六次循环:取出4和17,4是叶子节点但和不等于22
8. 第七次循环:取出7和27,7是叶子节点但和不等于22
9. 第八次循环:取出2和22,2是叶子节点且和等于22,返回true

 总结

这种使用双队列的BFS解法具有以下优点:
1.通过两个队列分别维护节点和路径和,逻辑清晰易懂
2. 与传统的树的层序遍历方式一致,便于理解和记忆
3. 可以轻松扩展为求解所有路径或路径详情等变种问题

需要注意的关键点是在判断满足条件时,必须同时满足:
1. 当前节点的路径和等于目标值
2. 当前节点为叶子节点(没有左右子节点)

这种解法是解决路径总和问题的经典方法之一,值得熟练掌握。

http://www.xdnf.cn/news/17184.html

相关文章:

  • pipeline方法关系抽取--课堂笔记
  • SpringBoot AI心理学训练实战
  • 《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
  • FastAPI快速入门P2:与SpringBoot比较
  • Google AI 发布 MLE-STAR:一款能够自动执行各种 AI 任务的先进机器学习工程代理
  • 使标签垂直水平居中的多种方法
  • C#案例实战
  • 利用Coze平台生成测试用例
  • 基于vscode连接服务器实现远程开发
  • HTML总结全览
  • Go 单元测试:如何只运行某个测试函数(精确控制)
  • 【前端】网站favicon图标制作
  • Kubernetes 已弃用 `apps/v1beta1` 版本的 StatefulSet
  • @【JCIDS】【需求论证】联合能力集成与开发系统知识图谱
  • [数组]977.有序数组的平方;209.长度最小的子数组
  • 跨越系统孤岛:4A架构如何实现企业级一体化协同
  • 深度解析 TCP 三次握手与四次挥手:从原理到 HTTP/HTTPS 的应用
  • 【AI论文】iLRM:一种迭代式大型3D重建模型
  • Vue3视频播放组件自定义封装、控制是否自动播放、全屏小屏控制、loading加载、静音播放等样式完全自定义控制,代码复制即用
  • JAVA学习笔记 自增与自减的使用-006
  • uniapp转app时,cover-view的坑
  • Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
  • 基于k8s环境下的pulsar常用命令(下)
  • 创维智能融合终端SK-M424_S905L3芯片_2+8G_安卓9_线刷固件包
  • 计算机网络:目的网络在路由表项中的作用
  • 如何通过 5 种方式将照片从 iPad 传输到电脑
  • MongoDB学习专题(一)介绍安装基本操作
  • 电路基础相关知识
  • 【轮播图】H5端轮播图、横向滑动、划屏效果实现方案——Vue3+CSS position
  • Python爬虫09_Requests用bs4进行数据解析