DFS(深度优先遍历) 以及 BFS(广度优先遍历)

DFS (Deep First Search)

概念:
顾名思义,这种遍历方法是以深度为优先进行对图的搜索或者遍历,至于什么是以深度为优先条件,先看下面DFS的基本步骤:

( 这是一个递归思想的DFS)

DFS:从当前节点开始,先标记当前节点,再寻找与当前节点相邻,且未标记过的节点:

(1): 当前节点不存在下一个节点,则返回前一个节点进行DFS

(2): 当前节点存在下一个节点,则从下一个节点进行DFS

下面是图解:

一开始,可以看出,若没有走到死路,这种遍历方式会从start节点沿着一条路一直深入下去(start -> 1 -> 2 -> 3。
在这里插入图片描述

若走到死路,便会退回上一节点,遍历上一节点的其他相邻节点(2 -> 4)。
在这里插入图片描述
这样一直重复,直到找到终点。
在这里插入图片描述
DFS的伪代码:

 find(节点){

            if(此结点已经遍历 || 此节点在图外 || 节点不满足要求) return;
 
            if(找到了end节点) 输出结果 ; return;
 
            标记此节点,表示已经遍历过了;
 
            while(存在下一个相邻节点) find(下一个节点);
 
        }

BFS (Breadth First Search)

概念:
对于深度优先算法,强迫症就很不爽了,并表示:“为什么不干干净净,一层一层地从start节点搜索下去呢,就像病毒感染一样,这样才像正常的搜索的样子嘛。”于是便有了BFS算法(误)。广度优先算法便如其名字,它是以广度为优先的,一层一层搜索下去的,就像病毒感染,扩散性的传播下去。

图解:

下图中,start为搜索的初始节点,end为目标节点
在这里插入图片描述
我们先把star节点的关联节点遍历一次
在这里插入图片描述
接下来把第一步遍历过的节点当成start,重复第一步
在这里插入图片描述
重复一二步,这样便是一个放射样式的搜哦防范,直到找到end节点
在这里插入图片描述
可以看出,这样放射性的寻找方式,能找到从start到end的最近路(因为每次只走一步,且把所有的可能都走了,谁先到end说明这就是最短路)。怎么实现呢?

这里需要用到队列:

a. 比如每遍历start周围的一个“1”节点的时候,就把跟它相关联的“2”节点保存到队列中(“1”节点访问完之后队列内容:2,2,2,2)

b. 然后依次访问队列内容,并对每个队列元素重复a步骤(访问一个“2”节点之后队列的内容:2,2,2,3,3)。

c. 由此重复下去,直到队列为空或者搜索到终点。

广度优先的[递归]伪代码:
把start节点push入队列;

    while(队列不为空) {

        把队列首节点pop出队列;

        对节点进行相关处理或者判断;

        while(此节点有下一个相关节点){

            把相关节点push入对列;

        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43951936

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值