图深度优先、广度优先遍历(java)

article/2025/9/17 3:58:04

一、图的遍历

图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略:(1)深度优先遍历(2)广度优先遍历深度优先遍历基本思想。

二、深度优先遍历


图的深度优先搜索(Depth First Search)。
深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深1度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, 可以这样理解: 每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。

三、广度优先遍历

图的广度优先搜索(Broad First Search)。类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序.以便按这个顺序来访问这些结点的邻接结点 。

 四、代码实现 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;public class Graph {//储存顶点的集合private ArrayList<String> vertexList;//储存图对应的领接矩阵private int[][] edges;//边的数目private int numOfEdges;//记录某个节点是否被访问private boolean[] isVisited;public Graph(int n) {//初始化矩阵edges = new int[n][n];vertexList = new ArrayList<>(n);numOfEdges = 0;isVisited = new boolean[n];}/*** 深度优先遍历*/public void dfs() {isVisited=new boolean[getNumOfVertex()];//    遍历所有的节点,进行dfsfor (int i = 0; i < getNumOfVertex(); i++) {if (!isVisited[i]) {dfs(isVisited, i);}}}/*** 深度优先遍历** @param isVisited* @param i*/public void dfs(boolean[] isVisited, int i) {//    输出访问节点System.out.print(getValueByIndex(i) + " ");//    将该节点设置为已经访问isVisited[i] = true;//    查找节点i的第一个领结节点wint w = getFirstNeighbor(i);//如果存在邻接节点while (w != -1) {//如果这个节点没有被访问;if (!isVisited[w]) {dfs(isVisited, w);}//    如果w节点应景访问了w = getNextNeighbor(i, w);}}/*** 广度优先** @param isVisited* @param i*/private void bfs(boolean[] isVisited, int i) {//队列的头结点int u;//队列的领结节点int w;//队列,记录访问顺序LinkedList<Integer> queue = new LinkedList();//访问节点输出信息System.out.print(getValueByIndex(i) + " ");//标记为已访问节点isVisited[i] = true;//将节点加入队列queue.addLast(i);//while (!queue.isEmpty()) {//  取出队列的头结点下标u = queue.removeFirst();//   得到第一个领结节点的下标w = getFirstNeighbor(u);//    找到了while (w != -1) {//    是否访问过if (!isVisited[w]) {System.out.print(getValueByIndex(w) + " ");//    标记已经访问过isVisited[w] = true;//    入队queue.addLast(w);}//    以u为前驱点,找w后面的下一个节点,此处体现广度优先w = getNextNeighbor(u, w);}}}public void bfs() {isVisited=new boolean[getNumOfVertex()];for (int i = 0; i < getNumOfVertex(); i++) {if (!isVisited[i]) {bfs(isVisited, i);}}}/*** 得到第一个领结节点的下标** @param index* @return*/public int getFirstNeighbor(int index) {for (int i = 0; i < vertexList.size(); i++) {//判断边是否存在,存在默认为1if (edges[index][i] > 0) {return i;}}return -1;}/*** 根据当前节点v1,v2寻找下一个领结节点** @param v1* @param v2* @return*/public int getNextNeighbor(int v1, int v2) {for (int i = v2 + 1; i < vertexList.size(); i++) {if (edges[v1][i] > 0) {return i;}}return -1;}/*** 返回节点的个数** @return*/public int getNumOfVertex() {return vertexList.size();}/*** 得到边的数目** @return*/public int getNumOfEdges() {return numOfEdges;}/*** 根据下标,返回对应的数据** @param index* @return*/public String getValueByIndex(int index) {return vertexList.get(index);}/*** 获取val1,val2的权值** @param val1* @param val2* @return*/public int getWeight(int val1, int val2) {return edges[val1][val2];}/*** 插入节点** @param vertex*/public void insertVertex(String vertex) {vertexList.add(vertex);}/*** 添加边** @param val1   表示点的下标* @param val2   表示点的下标* @param weight 表示对应的值*/public void insetEdge(int val1, int val2, int weight) {edges[val1][val2] = weight;edges[val2][val1] = weight;numOfEdges++;}/*** 显示图对应的矩阵*/public void showGraph() {for (int[] item : edges) {System.out.println(Arrays.toString(item));}}
}

五、测试

 

public class GraphDemo {public static void main(String[] args) {//    测试图String[] vertexs = {"1", "2", "3", "4", "5","6","7","8"};//    创建图形Graph graph = new Graph(vertexs.length);//   循环的添加订单for (String vertex : vertexs) {graph.insertVertex(vertex);}//    添加边graph.insetEdge(0, 1, 1);graph.insetEdge(0, 2, 1);graph.insetEdge(1, 3, 1);graph.insetEdge(1, 4, 1);graph.insetEdge(3, 7, 1);graph.insetEdge(4, 7, 1);graph.insetEdge(2, 5, 1);graph.insetEdge(2, 6, 1);graph.insetEdge(5, 6, 1);//显示领接矩阵graph.showGraph();//    深度遍历邻接矩阵System.out.println("深度优先");graph.dfs();System.out.println();System.out.println("广度优先");graph.bfs();}
}
[0, 1, 1, 0, 0, 0, 0, 0]
[1, 0, 0, 1, 1, 0, 0, 0]
[1, 0, 0, 0, 0, 1, 1, 0]
[0, 1, 0, 0, 0, 0, 0, 1]
[0, 1, 0, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0, 1, 0]
[0, 0, 1, 0, 0, 1, 0, 0]
[0, 0, 0, 1, 1, 0, 0, 0]
深度优先
1 2 4 8 5 3 6 7 
广度优先
1 2 3 4 5 6 7 8 


http://chatgpt.dhexx.cn/article/223VoO5J.shtml

相关文章

总结深度优先与广度优先的区别

3 总结深度优先与广度优先的区别 1、区别 1&#xff09; 二叉树的深度优先遍历的非递归的通用做法是采用栈&#xff0c;广度优先遍历的非递归的通用做法是采用队列。 2&#xff09; 深度优先遍历&#xff1a;对每一个可能的分支路径深入到不能再深入为止&#xff0c;而且每个结…

连通图里的深度优先和广度优先遍历

从图中的某个顶点出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使得每个顶点仅被访问一次&#xff0c;这个过程称为图的遍历。图的遍历有两种&#xff1a;深度优先遍历和广度优先遍历。   图分为连通图和非连通图&#xff0c;这里主要讨论连通图…

广度优先算法

广度优先算法 本文主要以介绍算法思想为主这里并没有进行源码实现&#xff0c;但是给出推荐使用的数据结构和主要思想。 首先介绍一下广度优先算法&#xff0c;假设要查找AB两点之间的最短距离&#xff0c;以A为起点B为终点。可以先遍历A的相邻节点&#xff0c;这些节点称之为…

C语言基于邻接表的图的深度优先、广度优先遍历

目录 1 深度优先&#xff08;Depth_First Search&#xff09; 2 广度优先&#xff08;Broadth_First Search&#xff09; 3 基于邻接表的深度优先、广度优先遍历 4 源代码示例 4.1 深度优先 4.2广度优先 假设有无向图G &#xff08;V&#xff0c;E&#xff09;&#xff…

数据结构之深度优先和广度优先遍历

文章目录 图为什么要有图图的常用概念邻接矩阵邻接表图的深度优先遍历深度优先遍历基本思想深度优先遍历算法步骤深度优先算法的代码实现 图的广度优先遍历广度优先遍历基本思想广度优先遍历算法步骤广度优先算法的代码实现图结构完整代码 图 为什么要有图 1)前面我们学了线性…

图的深度优先和广度优先遍历算法

编写一个程序&#xff0c;输出下面带权有向图的邻接表&#xff0c;并根据该邻接表&#xff0c;实现图的遍历运算&#xff0c;具体要求如下&#xff1a; (1)从顶点0开始的深度优先遍历序列(递归算法) (2)从顶点0开始的深度优先遍历序列(非递归算法) (3)从顶点0开始的广度优先遍历…

算法之深度优先、广度优先算法

目录 前言&#xff1a; 搜索算法&#xff1a; 广度优先搜索算法 深度优先搜索算法 问题&#xff1a;如何找出社交网络中某个用户的三度好友关系&#xff1f; 总结&#xff1a; 参考资料&#xff1a; 前言&#xff1a; 图这种数据结构经常用于表示一个社交网络&#x…

广度优先搜索与深度优先搜索

广度优先搜索&#xff08;宽度优先搜索&#xff0c;BFS&#xff09;和深度优先搜索&#xff08;DFS&#xff09;算法的应用非常广泛&#xff0c;本篇文章主要介绍BFS与DFS的原理、实现和应用。 深度优先搜索 图的深度优先搜索(Depth First Search)&#xff0c;和树的先序遍历…

深度优先遍历与广度优先遍历

1、深度优先遍历(Depth First Search, 简称 DFS) 1.1、主要思路 从图中一个未访问的顶点 V 开始&#xff0c;沿着一条路一直走到底&#xff0c;然后从这条路尽头的节点回退到上一个节点&#xff0c;再从另一条路开始走到底…&#xff0c;不断递归重复此过程&#xff0c;直到所…

深度优先与广度优先

深度优先遍历简称DFS&#xff08;Depth First Search&#xff09;&#xff0c;广度优先遍历简称BFS&#xff08;Breadth First Search&#xff09;&#xff0c;它们是遍历图当中所有顶点的两种方式。 深度优先遍历&#xff1a; 选取一个节点开始&#xff0c;沿着一条路一直走…

深度优先遍历(DFS)和广度优先遍历(BFS)

深度优先遍历&#xff08;DFS&#xff09;和广度优先遍历&#xff08;BFS&#xff09; 图的遍历&#xff1a;所谓遍历&#xff0c;即是对结点的访问。一个图有多个结点&#xff0c;如何遍历这些结点&#xff0c;有两种访问策略&#xff1a; 深度优先遍历(Depth First Search, …

深度优先与广度优先的区别!

从深度优先和广度优先两个角度解决同一个问题 题目 从一号顶点开始遍历这个图&#xff0c;使用深度优先搜索和广度优先搜索的2种遍历结果 深度优先遍历的主要思想就是&#xff0c;首先以一个未被访问过的顶点作为起始顶点&#xff0c;沿着当前顶点的边走到未访问过的顶点&…

数据结构:图的遍历--深度优先、广度优先

图的遍历&#xff1a;深度优先、广度优先 遍历 图的遍历是指从图中的某一顶点出发&#xff0c;按照一定的策略访问图中的每一个顶点。当然&#xff0c;每个顶点有且只能被访问一次。 在图的遍历中&#xff0c;深度优先和广度优先是最常使用的两种遍历方式。这两种遍历方式对无…

深度优先搜索与广度优先搜索

算法是作用于具体数据结构之上的&#xff0c;深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为&#xff0c;图这种数据结构的表达能力很强&#xff0c;大部分涉及搜索的场景都可以抽象成“图”。 图上的搜索算法&#xff0c;最直接的理解就是&#…

广度优先搜索和深度优先搜索

文章目录 1. 前言2. 广度优先搜索和深度优先搜索1&#xff09;深度优先搜索2&#xff09;广度优先搜索 3. 深度优先搜索算法框架1&#xff09;二叉树深度优先搜索模板2&#xff09;图深度优先搜索模板3&#xff09;二维矩阵深度优先搜索模板 4. 广度优先搜索算法框架1&#xff…

深度优先和广度优先算法

1、深度优先算法 遍历规则&#xff1a;不断地沿着顶点的深度方向遍历。顶点的深度方向是指它的邻接点方向。 最后得出的结果为&#xff1a;ABDECFHG。 Python代码实现的伪代码如下&#xff1a; 2、广度优先算法&#xff1a; 遍历规则&#xff1a; 1&#xff09;先访问完当…

深度优先搜索(DFS)和广度优先搜索(BFS)

代码随想录 深度优先搜索和广度优先搜索&#xff0c;都是图形搜索算法&#xff0c;它两相似&#xff0c;又却不同&#xff0c;在应用上也被用到不同的地方。这里拿一起讨论&#xff0c;方便比较。 先给大家说一下两者大概的区别&#xff1a; 如果搜索是以接近起始状态的程序依次…

算法:深度优先和广度优先(DFS,BFS)

一丶深度优先&#xff08;DFS&#xff09; 深度优先顾名思义: 就是往深的地方优先查找或遍历。 如图二叉树&#xff0c;想遍历树中所有结点可以用中序遍历&#xff0c;前序或后序。如果某一结点还有子结点就会往深处就是往下一结点&#xff0c;一直遍历直到最后一个结点没有子…

【算法】深度优先和广度优先

本文只是总结的相关概念&#xff0c;仅供自己复习&#xff0c;严禁转载&#xff0c;文末附有本文内容涉及的文章链接&#xff0c;请点开链接查看原文&#xff01; &#xff08;一&#xff09;深度优先 深度优先搜索属于图算法的一种&#xff0c;是一个针对图和树的遍历算法&am…

算法:深度优先遍历和广度优先遍历

什么是深度、广度优先遍历 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使每个顶点仅被访问一次&#xff0c;这个过程称为图的遍历。遍历过程中得到的顶点…