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

LeetCode 深度优先搜索(DFS)题解

LeetCode 深度优先搜索(DFS)题解

题目描述

深度优先搜索是一种用于遍历或搜索树或图的算法。该算法从根节点开始,沿着一条路径尽可能深地探索,直到不能继续为止,然后回溯到上一个节点,继续探索其他路径。

示例

对于以下树结构:

1 / \ 2 3 / \ 4 5

深度优先搜索的遍历顺序可以是:1 → 2 → 4 → 5 → 3。

解题思路

方法:深度优先搜索

思路

  • 深度优先搜索的核心思想是尽可能深地探索图或树的路径,直到不能继续为止,然后回溯。
  • 对于树结构,深度优先搜索可以分为前序遍历、中序遍历和后序遍历。
  • 对于图结构,深度优先搜索需要记录已访问的节点,以避免重复访问。

复杂度分析

  • 时间复杂度:O(V + E),其中 V 是顶点数,E 是边数。每个顶点和边都会被访问一次。
  • 空间复杂度:O(V),需要使用栈来存储递归调用的信息,最坏情况下栈的深度为 V。

代码实现

方法:深度优先搜索(树的前序遍历)

# 定义树节点 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 深度优先搜索(前序遍历) def dfs_preorder(root): if not root: return [] result = [] stack = [root] while stack: node = stack.pop() result.append(node.val) # 先压入右子节点,再压入左子节点,这样弹出时会先处理左子节点 if node.right: stack.append(node.right) if node.left: stack.append(node.left) return result # 测试 def test_dfs_preorder(): # 构建树结构 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) # 测试前序遍历 print(dfs_preorder(root)) # 输出:[1, 2, 4, 5, 3] if __name__ == "__main__": test_dfs_preorder()

方法:深度优先搜索(图的遍历)

# 深度优先搜索(图的遍历) def dfs_graph(graph, start, visited=None): if visited is None: visited = set() visited.add(start) print(start, end=' ') for neighbor in graph[start]: if neighbor not in visited: dfs_graph(graph, neighbor, visited) # 测试 def test_dfs_graph(): # 构建图结构 graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } # 测试图的遍历 print("DFS traversal starting from A:") dfs_graph(graph, 'A') # 输出:A B D E F C if __name__ == "__main__": test_dfs_graph()

测试用例

测试用例 1:树的前序遍历

输入:

1 / \ 2 3 / \ 4 5

输出:[1, 2, 4, 5, 3]

测试用例 2:图的遍历

输入:

A -- B -- D | | C -- F -- E

输出:A B D E F C

总结

深度优先搜索是一种重要的图论算法,它可以用于遍历树和图,以及解决许多相关问题,如路径查找、连通性判断等。通过递归或栈的方式,深度优先搜索可以高效地探索图或树的结构。

深度优先搜索的核心思想是:尽可能深地探索路径,直到不能继续为止,然后回溯到上一个节点,继续探索其他路径。

掌握深度优先搜索的原理和实现,对于理解和解决图论相关问题非常重要。

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

相关文章:

  • 猫抓浏览器扩展完全指南:免费开源资源嗅探工具终极教程
  • 从感受野计算到代码实现:用Python可视化带你彻底搞懂空洞卷积的等效卷积核
  • 3个关键步骤:实现浏览器媒体资源智能捕获的完整方案
  • axilite + ap_memory约束数组-突破单口RAM限制
  • AI赋能的个性化国际教育崛起:2026深圳国际学校革命性择校指南 - 深度智识库
  • 三步掌握SakuraFrp:内网穿透终极实战指南
  • Kodi IPTV Simple完整指南:3步搭建专业级家庭电视直播系统
  • 瑞芯微(EASY EAI)RV1126B ROS2安装
  • 你的宽带真的支持IPv6吗?手把手教你用手机热点+MobaXterm远程办公
  • 避坑指南:在Ruoyi-Vue中实现登录拦截与密码重置,我踩了这三个Token管理的坑
  • 2026年数控钣金公司实力排行/钣金,钣金加工,钣金件加工,精密不锈钢钣金加工 - 品牌策略师
  • Amulet-Map-Editor完整功能解析:从世界编辑到格式转换
  • Yew物联网:MQTT和WebSocket通信的终极指南
  • 终极Python多线程与多进程编程指南:从入门到实践的完整路径
  • 如何利用Composer二进制包支持高效分发PHP扩展和工具
  • Smithbox终极指南:如何轻松修改你最喜欢的魂系游戏
  • 一键安装HS2-HF_Patch:解锁Honey Select 2完整游戏体验的终极指南
  • OpCore Simplify:3步完成黑苹果OpenCore配置的完整指南
  • 2026年,还想要入局大模型领域的学习和工作,还来得及吗?红利期还在吗?
  • Hostinger主机稳定吗 - 麦麦唛
  • AI领域重大周记:超级学习者获11亿美元融资、生成式AI监管落地、大模型与具身智能双线突破
  • 专业级VR视频转换工具:将沉浸式3D内容转为2D格式的技术解析与实践指南
  • 告别‘XXX is not a type’:一份Qt Quick项目的.qrc文件配置保姆级指南(含CMake/QMake)
  • DIY一个低成本气象站:STM32F103C8T6核心板+OLED显示风速风向温湿度
  • 暗黑2存档编辑器实战手册:掌握游戏存档修改的终极技巧
  • USB/IP for Windows:如何实现跨网络USB设备共享的完整指南
  • 2026年Creo产品结构设计培训参考指南:Creo产品设计培训、ProE/Creo结构设计培训、Creo结构工程师培训、深圳零壹教育深耕实战教学,助力职业成长 - 海棠依旧大
  • 九江黄金回收怎么选?濂溪区、浔阳区、瑞昌
  • 从ACRONYM数据集到真实机器人:我是如何用Contact-GraspNet复现90%抓取成功率的
  • 告别‘抽风’电机!用Arduino和A4950实现精准调速(附完整代码与接线图)