博客
关于我
DFS深度优先搜索遍历
阅读量:237 次
发布时间:2019-03-01

本文共 1166 字,大约阅读时间需要 3 分钟。

深度优先搜索(DFS,Depth First Search)是一种常见的图和树遍历算法,早在19世纪就被用于解决迷宫问题。DFS通过使用栈来实现,而与广度优先搜索(BFS)相比,主要区别在于换用了栈数据结构。栈具有后进先出的特性(Last In First Out,LIFO),这使得DFS在探索图时,会优先深入一条路径再回溯。

DFS的基本实现步骤如下:

  • 将起始点放入栈中,并标记为已访问。
  • 重复以下步骤,直到栈为空:
    • 从栈顶取出当前节点。
    • 访问该节点。
    • 找到该节点的所有未访问的邻接点,将这些点按预定规则(如按编号升序)排列后,一起压入栈中。
    • 如果当前节点没有未访问的邻接点,则将其从栈中弹出。
  • 以一棵示例树为例(假设左分枝优先):

  • 将根节点1放入栈中。
  • 取出1,标记为已访问。
    • 1的邻接点为2和9,按规则选择2。
    • 将2放入栈。
  • 取出2,标记为已访问。
    • 2的邻接点为1、3、5。1已访问,排除。选择3。
    • 将3放入栈。
  • 取出3,标记为已访问。
    • 3的邻接点为2和4。2已访问,排除。选择4。
    • 将4放入栈。
  • 取出4,标记为已访问。
    • 4的邻接点为3、5、6。3已访问,排除。选择5。
    • 将5放入栈。
  • 取出5,标记为已访问。
    • 5的邻接点为2、4,均已访问。无未访问节点,弹出5。
  • 取出4,标记为已访问。
    • 4的邻接点为6。
    • 将6放入栈。
  • 取出6,标记为已访问。
    • 6的邻接点为4、7、8。4已访问,排除。选择7。
    • 将7放入栈。
  • 取出7,标记为已访问。
    • 7的邻接点为6,已访问。无未访问节点,弹出7。
  • 取出6,标记为已访问。
    • 6的邻接点为8。
    • 将8放入栈。
  • 取出8,标记为已访问。
    • 8的邻接点为1、6、9。1、6已访问,排除。选择9。
    • 将9放入栈。
  • 取出9,标记为已访问。
    • 9的邻接点无未访问节点,弹出9。
  • 栈中剩余节点依次为8、6、4、3、2、1,即将被弹出,DFS遍历完成。
  • DFS的递归实现方式如下:

    int visited[maxSize];void DFS(AGraph *G, int V) {    visited[V] = 1; // 标记为已访问    printf("%d", V); // 输出访问节点    ArcNode *p = G->adjlist[V].firstarc;    while (p != null) {        if (visited[p->adjvex] == 0) { // 如果邻接点未访问            DFS(G, p->adjvex); // 递归访问        }        p = p->nextarc; // 指向下一条边    }}

    通过这个过程,可以清晰地看到DFS如何深入探索每一条路径,再回溯处理。这种方法确保了在有限的资源下,能够高效地遍历图结构。

    转载地址:http://krzt.baihongyu.com/

    你可能感兴趣的文章
    nginx 代理解决跨域
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 学习(一):Nginx 下载和启动
    查看>>
    nginx 常用指令配置总结
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 结合 consul 实现动态负载均衡
    查看>>