LeetCode题目113:多种算法实现 路径总和ll

题目描述

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

示例

示例

输入:

    5/ \4   8/   / \
11  13  4
/ \      / \
7   2    5   1

目标和 targetSum = 22

输出:[[5,4,11,2], [5,8,4,5]]

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

解题步骤
  1. 递归函数定义:定义一个辅助函数来递归检查每个节点,传递当前路径和累积路径列表。
  2. 递归终止条件:如果当前节点是叶子节点,并且其值加上累计总和等于目标值,将路径添加到结果列表。
  3. 递归逻辑:递归检查当前节点的左右子节点,并更新路径列表和当前和。
Python 示例
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef pathSum(root, targetSum):results = []def dfs(node, current_sum, path):if not node:returncurrent_sum += node.valpath.append(node.val)if not node.left and not node.right and current_sum == targetSum:results.append(path.copy())  # 注意复制列表dfs(node.left, current_sum, path)dfs(node.right, current_sum, path)path.pop()  # 回溯dfs(root, 0, [])return results
算法分析
  • 时间复杂度:(O(n)),每个节点访问一次。
  • 空间复杂度:(O(h)),递归栈的深度,其中 (h) 是树的高度。

方法一使用递归的深度优先搜索(DFS)来寻找所有符合条件的路径。虽然这种方法直观且能有效地解决问题,但它可能会因为大量的递归调用而在空间复杂度上较高,特别是在不平衡的树中。以下是对方法一的几项改进,旨在优化其性能和可读性。

方法一改进:优化的递归DFS

改进点
  1. 短路逻辑:一旦达到一个叶子节点并且路径和不符合目标值,立即回溯,减少不必要的递归。
  2. 减少中间数组操作:通过直接传递路径而不是在每次递归中创建新的数组拷贝,可以减少内存的使用和可能的垃圾回收。
改进后的 Python 示例
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef pathSum(root, targetSum):results = []def dfs(node, current_sum, path):if not node:return# 更新当前路径和current_sum += node.val# 将当前节点值添加到路径中path.append(node.val)# 检查当前节点是否为叶子节点且路径和是否符合条件if not node.left and not node.right:if current_sum == targetSum:results.append(list(path))  # 添加一份路径的拷贝# 递归遍历左右子节点if node.left:dfs(node.left, current_sum, path)if node.right:dfs(node.right, current_sum, path)# 回溯,移除当前节点值path.pop()dfs(root, 0, [])return results
算法分析
  • 时间复杂度:优化后,时间复杂度仍为 (O(n)),因为每个节点最多被访问一次。
  • 空间复杂度:优化后的空间复杂度主要取决于递归的深度,最坏情况下为 (O(h)),其中 (h) 是树的高度。使用回溯法避免了不必要的数组拷贝,减少了内存占用。
优劣势比较
  • 优点
    • 减少内存占用,尤其是通过避免不必要的数组拷贝。
    • 短路逻辑减少了无效的路径探索,提高了算法效率。
  • 缺点
    • 代码复杂度略有增加,需要仔细管理路径变量和回溯机制。

通过这种改进,递归方法在处理复杂或深度较大的树结构时变得更加高效和稳健。这种优化使得方法既能快速找到解决方案,又能控制内存的使用,适合在资源受限的环境中运行。

方法二:迭代使用栈

解题步骤
  1. 使用栈:利用栈存储每个节点及其对应的路径总和和当前路径。
  2. 迭代逻辑:迭代访问每个节点,更新路径总和,检查叶子节点的路径总和。
Python 示例
def pathSum(root, targetSum):if not root:return []results = []stack = [(root, root.val, [root.val])]while stack:node, curr_sum, path = stack.pop()if not node.left and not node.right and curr_sum == targetSum:results.append(path)if node.right:stack.append((node.right, curr_sum + node.right.val, path + [node.right.val]))if node.left:stack.append((node.left, curr_sum + node.left.val, path + [node.left.val]))return results
算法分析
  • 时间复杂度:(O(n)),每个节点至多访问一次。
  • 空间复杂度:(O(n)),在最坏的情况下,栈中需要存储所有节点。

优劣势对比

方法优点缺点
DFS递归代码直观易懂;适合复杂树结构高空间复杂度,依赖于树的高度
迭代使用栈明确控制遍历过程;适合避免递归引起的问题空间复杂度较高,代码复杂度高于递归

应用示例

这些方法广泛应用于计算机科学的多个领域,尤其是在路径和网络流中,路径总和问题可用于决策支持系统、资源管理和网络数据传输路径优化等方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【线性代数】俗说矩阵听课笔记

基础解系的概念 31线性相关&#xff0c;线性无关&#xff0c;拓展与证明 n个m维向量在n<m时可能线性相关也可能线性无关&#xff0c;线性无关时可以构成某个m维空间的一组基。m不小于n时&#xff0c;秩小于n则线性相关。 n个m维向量在n>m时可一定线性相关。低维向量一定…

第八届大数据与物联网国际会议(BDIOT 2024)即将召开!

第八届大数据与物联网国际会议(BDIOT 2024)将于2024年9月14-16日在澳门圣若瑟大学举行。数聚未来&#xff0c;物联世界&#xff01;BDIOT 2024旨在搭建为各位与会代表展示自己研究成果、分享经验、建立联系和开展合作的平台&#xff0c;共同探讨大数据与物联网领域的未来发展方…

贪心算法(活动选择、分数背包问题)

一、贪心算法 贪心算法是指&#xff1a;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择&#xff0c;而不从整体最优考虑&#xff0c;做出的仅是在某种意义上的局部最优解。 …

不可逆加密算法、可逆加密算法

一、不可逆加密算法 不可逆加密算法&#xff0c;也称为哈希算法或单向加密算法&#xff0c;其最大的特点是在加密过程中不需要使用密钥&#xff0c;且加密后的数据无法被解密回原文。这种算法通过算法的结构&#xff0c;使得密文无法解密成明文。常见的不可逆加密算法有MD5、SH…

token无感刷新

token无感刷新长token过期处理当短token过期之后&#xff0c;需要刷新token&#xff0c;但是进来了很多请求&#xff0c;不需要每个请求都去刷新token处理 所用技术栈&#xff1a;Vue3TSVitearco-design 1.模拟页面&#xff0c;进行登录和数据请求 <template><div …

Dockerfile实践java项目

目的&#xff1a;用java项目测试dockerfil部署&#xff08;前提是安装好了docker&#xff09; 部署准备文件如下 1. java项目 java项目demo地址 https://gitee.com/xiaoqu_12/dockerfileDemo.git 或者百度网盘直接下载打包好的jar包 链接&#xff1a;https://pan.baidu.com/s/…

解决windows中的WS Llinux子系统(unbantu2204)访问网络失败问题?

一、问题描述 unbantu先前可以正常访问网络&#xff0c;后面用着用着发现上不了网了&#xff0c; 出现如下异常 Hmm. We’re having trouble finding that site.We can’t connect to the server at www.iqiyi.com.If you entered the right address, you can:Try again late…

C#winfrom三层架构实现简单课程管理系统管理系统,三层架构实现增删改查

1. 项目展示 1.1登录展示 1.2添加课程信息展示 1.3课程信息管理-查询-修改-删除 1.4修改登录密码 2.项目功能介绍&#xff08;图&#xff09; 3.数据库设计 3.1 教师表设计 3.2 课程分类表 3.3 课程信息表 4. 创建样式界面 winfrom 超详细UI创建过程 实现双色球选号器UI界面…

回传方案笔记

项目涉及业务系统交互&#xff0c;需要用到回传&#xff0c;饱受折磨后&#xff0c;决定整理一下。 简述 回传不是一个方法&#xff0c;或一个功能。虽然说是功能也没错&#xff0c;但是个复杂的功能或是一套机制更合适。 首先&#xff0c;不只是落库的数据需要回传&#xf…

刷题笔记 - 滑动窗口

文章目录 滑动窗口最长无重复子串最小覆盖子串串联所有单词的子串长度最小的子数组滑动窗口最大值字符串的排列最小区间 滑动窗口 所有题目来自leetcode的回答&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/3982/hua-d…

【算法】滑动窗口——将x减到0的最小操作数

本节博客主要是讲的我解“将x减到0的最小操作数”这道题的思路历程&#xff0c;从最开始的想法到代码提交的详细记录&#xff0c;有需要借鉴即可。 目录 1.题目2.代码示例3.细节3.1left越界3.2特殊情况 4.总结 1.题目 题目链接&#xff1a;LINK 看题目意思是就是给你一个数X&…

uni-app 安装 uni-app-fetch 进行接口请求的封装

1、在 uni-app 中通过 uni.request 发起网络请求&#xff0c;在实际的应用中需要结合一些业务场景进行二次封装&#xff0c;比如配置 baseURL、拦截器等&#xff0c; 1、uni-app-fetch 是对 uni.request 的封装&#xff0c;通过 npm 来安装该模块 # 安装 uni-app-fetch 模块 …

04.化栈为队

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

MySQL LRU算法(冷热数据分离)

背景 MySQL中使用的InnoDB存储引擎采用了一种特别的最近最少使用&#xff08;LRU, Least Recently Used&#xff09;算法来管理其Buffer Pool中的页&#xff08;包括数据页和索引页&#xff09;。Buffer Pool是InnoDB用来缓存数据&#xff0c;以减少磁盘I/O操作的内存区域。正…

初识C语言——第十一天

操作符&#xff1a; 1. 算数操作符&#xff1a; - * / % 2. 移位操作符&#xff1a; >> &#xff08;右移&#xff09; << &#xff08;左移&#xff09; 移动的是二进制位 例如&#xff1a; int ba<<1; 3. 位操作符&#xff1a; & 按位与 | 按位…

活动预告 | 5月16日 Streaming Lakehouse Meetup · Online 与你相约!

随着 Apache Flink 技术社区的不断成熟和发展&#xff0c;越来越多企业开始利用 Flink 进行流式数据处理&#xff0c;从而提升数据时效性价值&#xff0c;获取业务实时化效果。与此同时&#xff0c;在大数据领域数据湖架构也日益成为新的技术趋势&#xff0c;越来越多企业开始采…

NERF++:Analyzing and Improving Neural Radiance Fields神经辐射场的分析与改进

ABSTRACT 神经辐射场(NeRF)可以实现各种捕获设置的令人印象深刻的视图合成结果&#xff0c;包括360度捕获有界场景和前向捕获有界和无界场景。NeRF 将代表视图不变不透明度和视图相关颜色体积的多层感知器(MLPs)匹配到一组训练图像中&#xff0c;并基于立体渲染技术对新视图进…

nestjs版若依全栈管理后台完全开源!

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续和大家分享一下我们小伙伴开源的基于 nestjs 的若依全栈管理系统。 相信前端小伙伴对若依管理系统并不陌生&#xff0c;它的后端采用…

股票退市的最新要求!

五一假期一过&#xff0c;多家上市公司都进入退市名单&#xff0c;不知道有没有您的股票&#xff1f;很多朋友直呼现在炒股越来越难&#xff0c;一步小心就买到了退市个股&#xff0c;加上新改革&#xff0c;我们一起来结合退市政策来了解下怎么挑选个股&#xff1f; 2024年最新…

JAVA队列相关习题4

1. 用队列实现栈。 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 一个队列无法实现栈 尝试使用两个队列 1)push元素的时候应当放在那里&#xff1f;哪个队列不为空就放在哪里 2&#xff09;出栈的时候&#xff0c;出不为空的队列size-1元素&#xff0c;剩余元…