一篇文章搞懂深度优先搜索算法

深度优先搜索(DFS)是一种遍历树或图的算法,先深度后广度地搜索节点。原理包括从根节点开始,标记并递归遍历邻接节点。用途包括路径查找、拓扑排序等。文中提供了递归和栈两种方式的Python示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索树的分支。当节点v的所有边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

定义

深度优先搜索是一种先深度后广度的遍历算法,它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。

原理

深度优先搜索的原理可以概括为以下几个步骤:

  1. 从根节点开始,将根节点标记为已访问。
  2. 遍历根节点的所有未访问的邻接节点,对每一个邻接节点:
    a. 标记该节点为已访问。
    b. 递归地执行深度优先搜索。
  3. 如果所有邻接节点都被访问过,回溯到上一个节点,继续执行步骤2,直到所有节点都被访问过。

用途

深度优先搜索算法有多种用途,包括但不限于:

  • 查找图中的路径或连通性。
  • 拓扑排序。
  • 检测图中是否有环。
  • 寻找图中的桥或割点。

Python Demo

下面是一个使用深度优先搜索算法遍历树的Python示例。

# 使用递归实现的深度优先搜索
def dfs_recursive(graph, node, visited):
    if node not in visited:
        print(node, end=" ")
        visited.add(node)
        for neighbour in graph[node]:
            dfs_recursive(graph, neighbour, visited)
# 使用栈实现的深度优先搜索
def dfs_stack(graph, start_node):
    visited = set()
    stack = [start_node]
    while stack:
        node = stack.pop()
        if node not in visited:
            print(node, end=" ")
            visited.add(node)
            stack.extend(graph[node])
# 构建图
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}
# 使用递归进行深度优先搜索
print("递归DFS:")
dfs_recursive(graph, 'A', set())
# 使用栈进行深度优先搜索
print("\n栈DFS:")
dfs_stack(graph, 'A')

这个示例中,我们定义了一个简单的无向图,并使用两种方法实现了深度优先搜索:一种是递归实现,另一种是使用栈。运行这段代码,会分别以递归和栈的方式打印出图的深度优先遍历结果。

​--------------------------------------------------------------------------------------------------------------------------------------

作者个人简介:
💐大厂多年AI算法经验,创业中,兼任算法/产品/工程
🍎持续分享aigc干货
❤️提供人工智能相关岗位简历优化和技能辅导服务,欢迎骚扰。
🌺提供aigc产品推广服务

微信公众号:
Ai自然说
在这里插入图片描述
​关注后,自动发送您一份ai算法学习路线资料,完全免费。

个人微信:
pichaqiu1
在这里插入图片描述

这是我的个人微信,欢迎添加,找我讨论AI相关的内容。

微信群:

在这里插入图片描述

攒了一个微信群,大家可以在里面讨论AI相关的技术、产品、运营、商业知识和资讯,欢迎扫码加入。

知识星球:

在这里插入图片描述

运营了一个知识星球,我在里面会定期分享一些关于ai的高质量干货,欢迎扫码加入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ai知识精灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值