深度优先遍历(DFS)

这篇具有很好参考价值的文章主要介绍了深度优先遍历(DFS)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.与树的深度优先遍历之间的联系

图的深度优先遍历类似于树的先根遍历(递归)。

树的先根遍历:
//树的先根遍历
void PreOrder(TreeNode *R) {
    if (R != NULL) {
        visit(R);
        //访问根节点
        while (R还有下一个子树T)//新找到的相邻结点一定是没有访问过的结点
            Pre0rder(T);//先根遍历下一棵子树
    }
}

2.算法实现

图的深度优先遍历

使用的逻辑结构是栈。
如果是非连通图,依旧无法遍历完所有结点。
所以,需要在遍历完一轮结点后,扫描未被标记的结点。

visited数组防止重复访问。
代码实现:

bool visited[MAX_VERTEX_NUM];//访问标记数组

void DFSTraverse(Graph G) {//对图G进行深度优先遍历
    for (v = 0; v < G.vexnum; ++V)
        visited[v] = FALSE;//初始化已访问标记数据
    for (v = 0; v < G.vexnum; ++v)//本代码中是从v=0开始遍历
        if (!visited[v])
            DFS(G, v);
}

void DFS(Graph G, int v) { //从顶点v出发,深度优先遍历图G
    visit(v);//访问顶点v
    visited[v] = TRUE;//设已访问标记
    for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighor(G, v, w))
        if (!visited[w]) {// w为u的尚未访问的邻接顶点
            DFS(G, w);
        }
}

3.复杂度分析

1.空间复杂度

来自函数调用栈,最坏情况,递归深度为O(|V|)。最好情况,O(1)。

2.时间复杂度

时间复杂度=访问各结点所需时间+探索各条边所需时间。

  • 邻接矩阵存储的图: 访问|V|个顶点需要O(V)的时间,查找每个顶点的邻接点都需要O(V)的时间,而总共有|V|个顶点时间复杂度=O(IV|2)。
  • 邻接表存储的图:访问|V|个顶点需要O(|V|)的时间,查找各个顶点的邻接点共需要O(|E|)的时间,时间复杂度=O(|V|+|E|)。

4.深度优先生成树

每一个连通分量就是一颗深度优先生成树。

  1. 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一,深度优先生成树也唯一。
  2. 同一个图邻接表表示方式不唯一,因此深度优先遍历序列不唯一,深度优先生成树也不唯一。

调用多次DFS后,就是深度优先生成森林。文章来源地址https://www.toymoban.com/news/detail-686774.html

5.图的遍历和图的连通性

1.对于无向图
  • 调用BFS/DFS函数的次数=连通分量数。
  • 对于连通图,只需调用1次BFS/DFS。
2. 对于有向图
  • 调用BFS/DFS函数的次数要具体问题具体分析。
  • 若起始顶点到其他各顶点都有路径,则只需调用1次BFS/DFS 函数。
  • 对于强连通图,从任一结点出发都只需调用1次BFS/DFS。

到了这里,关于深度优先遍历(DFS)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】搜索算法(深度优先搜索 DFS和广度优先搜索 BFS)以及典型算法例题

    【数据结构与算法】系列文章链接: 【数据结构与算法】递推法和递归法解题(递归递推算法典型例题) 【数据结构与算法】系列文章链接: 【数据结构与算法】C++的STL模板(迭代器iterator、容器vector、队列queue、集合set、映射map)以及算法例题 【数据结构与算法】系列文章链

    2024年04月13日
    浏览(78)
  • 【数据结构与算法】图的深度优先和广度优先遍历

    😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页 ✨✨座右铭✨✨ : 坚持到底,决不放弃,是成功的保证,只要你不放弃,你就有机会,只要放弃的人,他肯定是不会成功的人。 图是一

    2024年02月02日
    浏览(58)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(53)
  • 【数据结构与算法】图的基本概念 | 邻接矩阵和邻接表 | 广度优先遍历和深度优先遍历

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E) ,其中: 顶点集合V = {x|x属于某

    2024年02月04日
    浏览(73)
  • 算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

    深度优先搜索算法 (Depth First Search):英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。 深度优先搜索采用了回溯思想,该算法沿着树的深度遍历树的节点,会尽可能深的搜索树的分支。当节点 v 的所在边都己被探寻过,搜

    2024年02月09日
    浏览(50)
  • 大话数据结构-图的深度优先遍历和广度优先遍历

      图的遍历分为深度优先遍历和广度优先遍历两种。   深度优先遍历(Depth First Search),也称为深度优先搜索,简称DFS,深度优先遍历,是指从某一个顶点开始,按照一定的规则,访问并记录下一个未访问顶点。对于非连通图,则是按连通分量,采用同一规则进行深度优

    2024年02月04日
    浏览(58)
  • (超详细)C++图的深度优先遍历、广度优先遍历(数据结构)

            根据下图,编写代码实现图的深度优先遍历和广度优先遍历。          按照英文字母顺序,以邻接表为存储结构,实现图的深度优先和广度优先遍历。遍历的顺序从顶点a开始。 以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。   (1)从顶点a,

    2024年02月08日
    浏览(61)
  • [算法日志]图论: 深度优先搜索(DFS)

    ​ 深度优先搜索算法是一种遍历图这种数据结构的算法策略,其中心思想是朝图节点的一个方向不断跳转,当该节点无下一个节点或所有方向都遍历完时,便回溯朝上一个节点的另一个方向继续遍历。这种搜索策略与回溯法有异曲同工之妙。 正因为和回溯法有相似之处,所

    2024年02月03日
    浏览(63)
  • 【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 (1) 先序遍历 的过

    2024年01月24日
    浏览(45)
  • 【算法详解 | DFS算法】深度优先搜索解走迷宫问题 | 深度优先图遍历

    by.Qin3Yu 本文需要读者掌握 结构体 和 栈 的操作基础,完整代码将在文章末尾展示。 特别声明:本文为了尽可能使用简单描述,以求简单明了,可能部分专有名词定义不准确。 栈相关操作可以参考我的往期博文: 【C++数据结构 | 栈速通】使用栈完成十进制数转二四八进制数

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包