博客
关于我
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/

    你可能感兴趣的文章
    Netty框架内的宝藏:ByteBuf
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—3.Reactor线程模型三
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—5.Pipeline和Handler二
    查看>>
    Netty源码—6.ByteBuf原理一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理一
    查看>>
    Netty源码—8.编解码原理二
    查看>>
    Netty源码解读
    查看>>
    Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
    查看>>
    Netty相关
    查看>>
    Netty遇到TCP发送缓冲区满了 写半包操作该如何处理
    查看>>
    Netty:ChannelPipeline和ChannelHandler为什么会鬼混在一起?
    查看>>
    Netty:原理架构解析
    查看>>