快速入门图的BFS和DFS

定义

在这里插入图片描述

问题引入(重要)

Q1:思考一下给你一个图 我们怎么遍历一个图呢?
回想起我们前面所学习的数据结构,例如链表我们通过它的头结点就能遍历出整条链表,但是图这种数据结构是做不到的,这是因为我们知道链表中元素之间的关系,他们是具有先后关系的,假如给每个节点编个号,他们的编号是唯一的,但是反观图,都不要说遍历了,连我们从图中哪个顶点开始遍历都不晓得
A1:

在这里插入图片描述
Q2:我们之前在图的章节介绍过非连通图,也就是说每个顶点不一定是连通的,那么我们一次遍历不完所有的顶点,这时候该怎么办?
A1:

在这里插入图片描述

Q3:回忆一下,我们在之前解决的走迷宫问题的时候,每次走到死胡同,都会回到上一次走到的路口继续做选择,通常会给这个迷宫设置一个flag,这里也是类似的,由于图中是非常有可能出现回路的,所以我们需要用类似的手段来去解决以免走入死胡同
A3:

在这里插入图片描述
Q4:想一下如果某个顶点是吴彦祖他有多个老婆,他应该先跟谁结婚呢?这就是后续我们学习到deep first和breadth first在优先级上的最大区别
A4:

在这里插入图片描述

深度优先遍历(DFS)

铺垫

其实我可以告诉你 我们在前面就学过了深度优先遍历,只不过当时你还不知道而已,深度优先遍历其实核心上还是递归,还是走迷宫的问题,我们走的过程是递推的过程,走到死胡同回退到上一个路口是回归的过程 这里贴上我之前文章 迷宫问题详解
我这个是之前还没学习递归时写的,我是用自己手动创建栈 进行压栈出栈操作来模拟系统栈来实现的,因为一般递归是需要用到堆栈空间的,先压栈保存现场,然后回退的时候,弹栈,回到上一次选择的时候,这么说可能有一些抽象,但是后面其实就后知后觉了,还是建议大家去看懒猫老师的视频,真是通俗易懂!懒猫老师视频课程链接

基本思想

其实简单来说就是一条路走到黑,然后这条路走到头,再回过头看看别的路

在这里插入图片描述
对于下面这张图长得样子 其实已经很大程度上给我们减少负担了,仔细观察一下这跟树的遍历是不是有99%的相似度啊,其实我现在就能跟你说广度优先遍历其实跟树的层序遍历99%相似
这样我们用我们的已知去解决未知的问题,这是非常关键的,减少了很多负担 建议大家还是看到就动手用草稿纸上画一下就很明了是怎么回事了

在这里插入图片描述
小练习:
在这里插入图片描述

伪代码实现

在这里插入图片描述

广度优先遍历(BFS)

基本思想

建议还是对照上面的DFS更好能理解一些
在这里插入图片描述
在这里插入图片描述
小练习
在这里插入图片描述

伪代码

在这里插入图片描述

结语

建议大家先三连一下 后续(不一口气更完实际上是懒)我会边学边完善包括但不限于这篇文章,包括具体上代码如何实现(包含C和C++),以及这两种方式遍历的很多不同点如何去形象生动的理解他等等,那么,希望看到这里的你有美好的一天!

*********************************************************************************signed by 曦月逸霜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值