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

    你可能感兴趣的文章
    Orderer节点启动报错解决方案:Not bootstrapping because of 3 existing channels
    查看>>
    org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement profile
    查看>>
    sql查询中 查询字段数据类型 int 与 String 出现问题
    查看>>
    org.apache.commons.beanutils.BasicDynaBean cannot be cast to ...
    查看>>
    org.apache.dubbo.common.serialize.SerializationException: com.alibaba.fastjson2.JSONException: not s
    查看>>
    sqlserver学习笔记(三)—— 为数据库添加新的用户
    查看>>
    org.apache.http.conn.HttpHostConnectException: Connection to refused
    查看>>
    org.apache.ibatis.binding.BindingException: Invalid bound statement错误一例
    查看>>
    org.apache.ibatis.exceptions.PersistenceException:
    查看>>
    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned
    查看>>
    org.apache.ibatis.type.TypeException: Could not resolve type alias 'xxxx'异常
    查看>>
    org.apache.poi.hssf.util.Region
    查看>>
    org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
    查看>>
    org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /
    查看>>
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugManifest'
    查看>>
    org.hibernate.HibernateException: Unable to get the default Bean Validation factory
    查看>>
    org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
    查看>>
    org.springframework.amqp.AmqpConnectException:java.net.ConnectException:Connection timed out:connect
    查看>>
    org.springframework.beans.factory.BeanDefinitionStoreException
    查看>>
    org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
    查看>>