什么是DFS、BFS?

一条线走到底,深度优先遍历,每一个顶点只遍历、只打印一次的方式:DFS、BFS 数据结构 --- 图的存储

单纯地把邻接顶点的邻接顶点打印出来,顶点重复遍历,打印多次

从 A→F 所有的节点都遍历完了,需要做回退,从F回退到D点,找D点有没有邻接顶点,没有邻接顶点,继续做回退,退到B节点,有未访问的邻接顶点,访问C顶点

如果遍历的节点已经被遍历了,不能重复遍历,要做回退

如果形成环状,也是重复遍历的情况,也要做回退

要做回退,用栈实现

当前节点如果不存在邻接顶点,就要做出栈操作

先把 A 的所有邻接顶点 B、C 遍历,按照当前节点的邻接顶点的遍历顺序做下一次遍历,如果 B 先遍历,就遍历 B 的所有邻接顶点,由于 B 的邻接顶点 C 已经被遍历了所以不需要遍历

做遍历时要判断当前节点是否被遍历,如果被遍历了就不需要遍历

用队列实现,通过出队的方式决定下一次遍历的顺序

先遍历 A,遍历 A 后,遍历 A 的邻接顶点 B、C,把 B、C 入队,当遍历完 A 的所有邻接顶点后,B出队,访问B的所有邻接顶点D,D访问完后入队,B没有邻接顶点,出队C,访问C的邻接顶点,C的邻接顶点为E,入队E

队列为空,整个图就遍历完成了

DFS 实现

连接方式与边的插入方式有关

准备一个栈,栈中存储的是位置 LPNODE,要做回退

邻接链表中的节点实际存的是序号,把序号拿出来

①从 A 入口进来,遍历 A 的横向链表,把 C 节点遍历完,入栈

②跳到 C 数组的位置,从 C 数组的位置,横向遍历 E 节点(跳到以 C 为头的横向链表中 C → E ),遍历完 E 节点后,跳到 E 的位置,遍历它的邻接顶点,E 的邻接顶点是 C,C 已经被遍历了,要做回退,退到链表 E 的位置,访问下一个邻接顶点,下一个邻接顶点没有被访问就访问. . .

数据结构 --- 图的存储

横向遍历的特点:从链表中找一个没有被访问的节点遍历,只要找到一个即可

//打印字符串-> 字符串数组
void printData(const char* str)
{printf("%s\t", str);
}
//遍历的图 入口:用序号表示第几个元素
void DFSTraverse(LPGRAPH g,int inPos)
{//准备一个栈LPNODE stack[MAX];int top = -1;//访问标记->被访问置为1int visited[MAX] = { 0 };//1.访问入口printData(g->vextex[inPos].data);//打印顶点信息-> 第几个顶点visited[inPos] = 1;              //对访问标记做处理-> 当前元素标记置为1表示已经被访问//定义一个移动的指针做横向遍历LPNODE pmove = g->vextex[inPos].firstNode;while (top != -1 ||pmove != NULL)//栈不为空 pmove不为空 {while (pmove != NULL) {//如果当前顶点的访问标记为1表示被访问,找下一个没有访问节点if (visited[pmove->index] == 1) {pmove = pmove->next; }else {printData(g->vextex[pmove->index].data);//访问数据visited[pmove->index] = 1;//访问后标记做处理stack[++top] = pmove;     //入栈//跳到访问到的节点的那个横向链表中去pmove = g->vextex[pmove->index].firstNode;}}if (top != -1)                    //pmove==NUll就做出栈操作{pmove = stack[top--];         //出栈pmove = pmove->next;          //回退到B的位置而不是E的位置->退到E的位置的下一个位置因为E位置已经被访问了}}
}

BFS 实现

连接方式与边的插入方式有关

①从 A 入口进来,把整个 A 的横向链表遍历完,遍历到空的位置结束

②把序号(位置)做入队操作:要知道哪个顶点是先遍历的,作为下一次遍历的依据,只需要准备一个队列,存放序号即可,不需要存节点,例如:B 节点是序号 1,c 节点是序号 2,只需要把 1,2 入队即可

③把 A 的横向链表遍历完后,1 出队,直接走到 1 的位置,做横向遍历,把 B 的横向链表遍历完

④注意要防止重复遍历,重复遍历的不做遍历,只遍历 D,F 即可,访问的节点也需要有一个标记,把 B 的横向链表遍历完后也需要把序号3、5入队

⑤把 2 出队. . .

把整个横向链表遍历完,已经做遍历的,不做遍历

可以用循环队列,普通队列如果节点过多,会出现伪溢出

//遍历的图 入口
void BFSTraverse(LPGRAPH g,int inPos)
{//访问标记int visited[MAX] = { 0 };int queue[MAX];//准备一个队列int front = -1;//队头int rear = -1; //队尾//访问入口-> 打印入口的值printData(g->vextex[inPos].data);//对访问标记做处理-> 1表示被访问visited[inPos] = 1;//入队-> 队尾做变化 从-1开始前置++queue[++rear] = inPos;//定义一个移动的指针作为横向遍历LPNODE pmove = NULL;//队头小于队尾while (front < rear) {inPos = queue[++front];               //出队pmove = g->vextex[inPos].firstNode;   //遍历当前序号下的横向链表 不为空打印里面的值while (pmove != NULL)              {if (visited[pmove->index] == 0)   //遍历前判断是否被访问,如果被访问就没必要访问 {printData(g->vextex[pmove->index].data);visited[pmove->index] = 1;    //访问后把访问标记做处理queue[++rear] = pmove->index; //把遍历节点的序号入队}pmove = pmove->next;              //被访问走到下一个节点}}
}

测试代码

int main()
{LPGRAPH g = createGraph();printf("DFS:\n");DFSTraverse(g,0);//从第0个节点开始遍历-> A节点printf("\nBFS:\n");BFSTraverse(g, 0);return 0;
}/*输出*/请输入边和顶点数:10 7
请输入所有顶点:A B C D E F G
请输入边的信息:
A B
A C
B C
B D
B F
D F
C E
F E
C G
E G
DFS:
A       C       G       E       F       D       B
BFS:
A       C       B       G       E       F       D

数据结构 --- 图的遍历 DFS、BFS相关推荐

  1. 【数据结构】图的遍历(BFS和DFS)

    图的遍历 图的遍历是指从图中的某一顶点出发,按照某种搜索方式沿着途中的边对图中所有顶点访问一次且仅访问一次.图的遍历主要有两种算法:广度优先搜索和深度优先搜索. 广度优先遍历BFS 广度优先遍历(BF ...

  2. (王道408考研数据结构)第六章图-第三节:图的遍历(DFS和BFS)

    文章目录 一:图的深度优先遍历(DFS) (1)回溯算法和DFS A:回溯算法的本质 B:回溯算法的框架 C:全排列 (2)图的DFS A:DFS思想 B:动画演示 C:代码 二:图的广度优先遍历(B ...

  3. 图的遍历:BFS和DFS

    前言 图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表 ...

  4. 图的遍历(BFS、DFS)

    前文使用邻接矩阵法和邻接链表法实现了图结构(MatrixGraph .ListGraph ),本节使用两种算法进行图的遍历 目录 1.定义与概括 2.广度优先搜索算法 3.深度优先搜索算法 4.小结 ...

  5. 图的遍历(DFS和BFS)

    图的遍历是指从图中某一顶点出发,访遍图中其余顶点,且使每一个顶点仅被访问一次. 一.深度优先遍历(Depth First Search) 假设给定图G的初态是所有顶点均未曾访问过.在G中任选一顶点v为 ...

  6. 数据结构 笔记:图的遍历(BFS)

    时间复杂度的对比分析   MatrixGraph ListGraph addVertex - O(n) removeVertex - O(n^2) getVertex O(1) O(n) setVer ...

  7. 数据结构 - 图的遍历

    图的遍历 图的遍历(Traversing Graph):从图的某一顶点出发,访遍图中的其余顶点,且每个顶点仅被访问一次. 图的遍历算法是各种图的操作的基础.但图的遍历存在以下特点: ◆ 复杂性:图的任 ...

  8. 【数据结构实验六】图的遍历DFS和BFS

    输入格式: 在第1行输入图的类型,1表示有向图,0表示无向图. 在第2行输入构造图的顶点,个数 N 不超过100.例如:图有5个顶点,则输入ABCDE. 后面 N 行,分别输入与ABCDE顶点相连的顶 ...

  9. 图的遍历DFS与BFS(邻接表)

    #include "stdafx.h" #include <iostream> #include <fstream> #include <queue& ...

最新文章

  1. 爱奇艺的数据库选型大法,实用不纠结!
  2. C语言函数集(十八)
  3. java web五: tomcat的目录层次结构以及web应用
  4. 数组计算的数学模块----NumPy
  5. ios ionic3 跳转第三方地图 xcode加入白名单
  6. ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列
  7. 深度学习-参数与超参数
  8. Docker Redis部署_04
  9. extras mibs php7,ubuntu编译安装php7遇到的问题及解决方案
  10. 2017.4.25 解方程 思考记录
  11. java day58【 案例:使用 spring 的 IoC 的实现账户的 CRUD 、 基于注解的 IOC 配置 、 Spring 整合 Junit[掌握] 】...
  12. android word文档预览(支持doc/docx两种格式)
  13. python数据可视化matplotlib之grid
  14. 激光雷达障碍物检测与追踪实战——基于欧几里德聚类的激光雷达障碍物检测
  15. 阿里云盘 手动获取token教程
  16. 他山之石 | 微信搜一搜中的智能问答技术
  17. 谷歌浏览器崩溃!亲测有效
  18. 如何在web端登录企业邮箱? 163企业邮箱怎么登陆?
  19. 1.产品/数据产品设计
  20. 3 个技巧教你轻松查看多开模拟器的端口号~

热门文章

  1. 视频播放过程中做视频问答(视频弹题功能)
  2. vue通过for循环生成的checkbox点击一个选中全部的问题
  3. 最值得收藏的Bootstrap免费字体和图标网站
  4. JAVA软件海豚_海豚调度系统Apache DolphinScheduler单机部署官方文档(Standalone)
  5. 南充中等计算机专业学校排名,南充计算机/电脑学校哪里好|南充外国语中等专业学校计算机应用|顺庆计算机学校怎么样|南充中专学校...
  6. 博学而笃志,切问而近思,仁在其中矣
  7. SAP销售开票同一客户实现不同统驭科目配置
  8. Powermill汽车件模具五轴数控CNC编程视频教程
  9. 机房动环监控系统有哪些告警功能,机房动环监控系统是什么?
  10. 2022年高处安装、维护、拆除操作证考试题库及在线模拟考试