深度优先遍历和广度优先遍历

article/2025/9/20 6:54:41

深度优先遍历和广度优先遍历
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
什么是 深度/广度 优先遍历?

深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。

这两种遍历方式有什么不同呢?我们来举个栗子:

我们来到一个游乐场,游乐场里有11个景点。我们从景点0开始,要玩遍游乐场的所有景点,可以有什么样的游玩次序呢?

在这里插入图片描述
第一种是一头扎到底的玩法。我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。

在图中,我们首先选择景点1的这条路,继续深入到景点7、景点8,终于发现走不动了(景点旁边的数字代表探索次序):
在这里插入图片描述
于是,我们退回到景点7,然后探索景点10,又走到了死胡同。于是,退回到景点1,探索景点9:
在这里插入图片描述
按照这个思路,我们再退回到景点0,后续依次探索景点2、3、5、4、6,终于玩遍了整个游乐场:
在这里插入图片描述
像这样先深入探索,走到头再回退寻找其他出路的遍历方式,就叫做深度优先遍历(DFS)。
在这里插入图片描述
在这里插入图片描述
除了像深度优先遍历这样一头扎到底的玩法以外,我们还有另一种玩法:首先把起点相邻的几个景点玩遍,然后去玩距离起点稍远一些(隔一层)的景点,然后再去玩距离起点更远一些(隔两层)的景点…

在图中,我们首先探索景点0的相邻景点1、2、3、4:
在这里插入图片描述
接着,我们探索与景点0相隔一层的景点7、9、5、6:
在这里插入图片描述
最后,我们探索与景点0相隔两层的景点8、10:
在这里插入图片描述
像这样一层一层由内而外的遍历方式,就叫做广度优先遍历(BFS)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
深度优先遍历

首先说说深度优先遍历的实现过程。这里所说的回溯是什么意思呢?回溯顾名思义,就是自后向前,追溯曾经走过的路径。

我们把刚才游乐场的例子抽象成数据结构的图,假如我们依次访问了顶点0、1、7、8,发现无路可走了,这时候我们要从顶点8退回到顶点7。

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190529211147549.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2EyMjE3MDE4MTAz,size_16,color_FFFFFF,t_70

而后我们探索了顶点10,又无路可走了,这时候我们要从顶点10退回到顶点7,再退回到顶点1。
在这里插入图片描述
像这样的自后向前追溯曾经访问过的路径,就叫做回溯。

要想实现回溯,可以利用栈的先入后出特性,也可以采用递归的方式(因为递归本身就是基于方法调用栈来实现)。

下面我们来演示一下具体实现过程。

首先访问顶点0、1、7、8,这四个顶点依次入栈,此时顶点8是栈顶:
在这里插入图片描述
从顶点8退回到顶点7,顶点8出栈:
在这里插入图片描述
接下来访问顶点10,顶点10入栈:
在这里插入图片描述
从顶点10退到顶点7,从顶点7退到顶点1,顶点10和顶点7出栈:
在这里插入图片描述
探索顶点9,顶点9入栈:
在这里插入图片描述
以此类推,利用这样一个临时栈来实现回溯,最终遍历完所有顶点。

广度优先遍历

接下来该说说广度优先遍历的实现过程了。刚才所说的重放是什么意思呢?似乎听起来和回溯差不多?其实,回溯与重放是完全相反的过程。

仍然以刚才的图为例,按照广度优先遍历的思想,我们首先遍历顶点0,然后遍历了邻近顶点1、2、3、4:

在这里插入图片描述
接下来我们要遍历更外围的顶点,可是如何找到这些更外围的顶点呢?我们需要把刚才遍历过的顶点1、2、3、4按顺序重新回顾一遍,从顶点1发现邻近的顶点7、9;从顶点3发现邻近的顶点5、6。
在这里插入图片描述
像这样把遍历过的顶点按照之前的遍历顺序重新回顾,就叫做重放。同样的,要实现重放也需要额外的存储空间,可以利用队列的先入先出特性来实现。

下面我们来演示一下具体实现过程。
首先遍历起点顶点0,顶点0入队:
在这里插入图片描述
接下来顶点0出队,遍历顶点0的邻近顶点1、2、3、4,并且把它们入队:
在这里插入图片描述
然后顶点1出队,遍历顶点1的邻近顶点7、9,并且把它们入队:
在这里插入图片描述
然后顶点2出队,没有新的顶点可入队:
在这里插入图片描述
以此类推,利用这样一个队列来实现重放,最终遍历完所有顶点。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
/**

图的顶点/ private static class Vertex { int data; Vertex(int data) {    this.data = data; } } /*图(邻接表形式)/ private static class Graph { private int size; private Vertex[] vertexes; private LinkedList adj[]; Graph(int size){    this.size = size;    //初始化顶点和邻接矩阵    vertexes = new Vertex[size];    adj = new LinkedList[size];    for(int i=0; i*深度优先遍历/ public static void dfs(Graph graph, int start, boolean[] visited) { System.out.println(graph.vertexes[start].data); visited[start] = true; for(int index : graph.adj[start]){    if(!visited[index]){        dfs(graph, index, visited);    } } } /*广度优先遍历*/public static void bfs(Graph graph, int start, boolean[] visited, LinkedList queue) {queue.offer(start);while (!queue.isEmpty()){int front = queue.poll();if(visited[front]){continue;}System.out.println(graph.vertexes[front].data);visited[front] = true;for(int index : graph.adj[front]){queue.offer(index);;}}}public static void main(String[] args) {Graph graph = new Graph(6);graph.adj[0].add(1);graph.adj[0].add(2);graph.adj[0].add(3);graph.adj[1].add(0);graph.adj[1].add(3);graph.adj[1].add(4);graph.adj[2].add(0);graph.adj[3].add(0);graph.adj[3].add(1);graph.adj[3].add(4);graph.adj[3].add(5);graph.adj[4].add(1);graph.adj[4].add(3);graph.adj[4].add(5);graph.adj[5].add(3);graph.adj[5].add(4);System.out.println("图的深度优先遍历:");dfs(graph, 0, new boolean[graph.size]);System.out.println("图的广度优先遍历:");bfs(graph, 0, new boolean[graph.size], new LinkedList());}

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/621TBlAp.shtml

相关文章

图的遍历(深度优先搜索)

1、深度优先搜索遍历过程 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出…

图的遍历算法之深度优先遍历(DFS)(C++)

图的深度优先遍历思想是: 从图中某结点出发,访问其某一相邻结点,再访问该结点的相邻结点,直至访问完所有的结点。 形象的比喻就是:一条路走到头,回头再走没走过的路。 可见,深度优先遍历是一…

图的深度优先遍历

一 图遍历介绍 所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略。 1 深度优先遍历 2 广度优先遍历 二 深度优先遍历基本思想 图的深度优先搜索(Depth First Search…

图的遍历 ——深度优先遍历

图的遍历 ——深度优先遍历 深度优先搜索(Depth First Search,DFS)是最常见的图搜索方法之一。 深度优先搜索沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。深度优先遍历是按照深度优先搜索的方式…

二、图的遍历——深度优先遍历

深度优先遍历,也有称为深度优先搜索,简称为DFS。 深度优先遍历其实就是一个递归的过程,它从图中某个顶点ⅴ出发,访问此顶点,然后从V的未被访问的邻接点出发深度优先遍历图,直至图中所有和V有路径相通的顶点…

图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DF&#xff…

使用SSM框架上传图片

使用SSM框架上传图片 为了大家方便对照,我上传源码到网盘,有兴趣的自取. ps:其中有一个存储数据的网页,我没删除,可以忽略 链接:https://pan.baidu.com/s/1u24E8mUs4K-raoQgx-ae2A 提取码:java 建数据表 CREATE DATABASE my_resource;USE my_resource…

SSM框架简单介绍

一. SSM框架简介及特征 1.SpringMVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可…

SSM框架整合详细教程

目录 1. 什么是SSM? 2. SSM整合的时候容器之间如何访问 3. SSM下面的开发步骤 4. SSM整合时候时容易混乱的知识点 1. 什么是SSM? SSM是对三个框架名字的简写,其中第一个S指的是SpringMVC,第二个S指的是Spring,第三个M指的是M…

SSM框架理解

一、作用: 1、 SSM是spingspringMVCmybatis集成的框架。是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层。 2、使用spring MVC负责请求的转发和视图管理,spring实现业务对象管理…

SSM框架初探

SSM 框架初探 SSM框架简介对框架的理解为什么使用 SSM 框架 SpringSpringMVCMybatis SSM框架简介 SSM框架一种以java语言作为后端搭建基本语言的应用系统搭建框架。是继SSH(strutsspringhibernate)之后,目前较为主流的Java EE企业级框架,适用于搭建各种大…

SSM框架整合

今天来整合一下SSM三大框架~~ 1、创建一个maven项目 比较简单就不赘述了,创建的时候选择webapp骨架。 用骨架创建的项目,在创建完之后要更新一下web.xml 模板目录:“你的Tomcat安装目录\webapps\ROOT\WEB-INF\web.xml” 2、项目整体结构 按…

SSM框架原理

SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现业务对象管理&#xff…

SSM框架总结

一:什么是SSM框架? SSM框架是Spring、SpringMVC和MyBatis框架的总结,是比较标准的MVC模式。 标注的SSM框架有四层:dao(mapper)层、service层、controller层、domain(entity)层。 使用Spring实现业务对象…

SSM框架详解

SSM框架详解 写在前面:当初整理SSM原理时,参考了网上一些前辈的文章,时间久远已经忘记来源,所以文中原理部分如有侵权请联系我删除。 基于SSM框架的仿天猫商城网站电商后台管理系统 本文视频讲解 文章目录 SSM框架详解 一、项…

java ssm框架论文,ssm框架理解

文章简介: SSM框架集简介 spring框架IOC的理解 mybatis框架sqlSessionFactory理解 Tomcat的理解 图解SSM SSM框架常用注解 1.SSM框架集简介 SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的…

SSM框架详细讲解

SSM框架 文章目录 SSM框架&#xff08;白痴都看完都会&#xff09;介绍SSM框架<原理>一、什么是SSM框架&#xff1f; 1.Spring2.Spring MVC3.Mybatis &#xff08;核心是SqlSession&#xff09;二、代码实战 1.创建配置工程2.代码实战&#xff08;查询记录数&#xff0…

SSM三大框架超详细总结(适合你重新回顾)

目录 1.1 概念 1.2 Mybatis优点 1.3 Mybatis架构 1.4 底层原理 1.5 Mybatis缓存 1.6 常见面试题 2.1 概念 2.2 Spring优点 2.3 Spring架构 2.4 控制反转&#xff08;IOC&#xff09; 2.5 DI依赖注入 2.6 底层原理(常见面试题) 8、如何用基于 Java 配置的方式配置 Spring&#…

SSM框架整合思想及步骤

前言 SSM框架即是将SpringMVC框架、Spring框架、MyBatis框架整合使用。以简化在web开发中繁琐、重复的操作&#xff0c;让开发人员的精力专注于业务处理的开发上。 一、SSM框架的思想 ssm框架根据SpringMVC、Spring、MyBatis三者各自的特性及应用场景对其操作的的业务进行了分…

SSM框架简介

一、Java SSM框架的概念 Java SSM框架即指SpringSpringMVCMyBatis的简称&#xff0c;框架集由Spring、MyBatis两个开源框架整合而成&#xff08;SpringMVC是Spring中的部分内容&#xff09;,常作为数据源较简单的web项目的框架。 相比于之前的SSH&#xff08;SpringStrutsHibe…