图的遍历方式

article/2025/10/28 8:03:32

图的遍历方式

图的遍历:从图中某一顶点出发访问图中其余顶点,且每一个顶点仅被访问一次。

图有2种常见的遍历方式(有向图、无向图都适用)

  • 广度优先搜索(Breadth First Search,BFS),又称为宽度优先搜索、横向优先搜索
  • 深度优先搜索(Depth First Search,DFS)

广度优先搜索

广度优先搜索:从起始节点开始一层一层的进行遍历,只有完全遍历完一层所有的节点后才会进入下一层的遍历。二叉树的层序遍历就是一种广度优先搜索。

在这里插入图片描述

在这里插入图片描述

Graph<V, E>接口中添加内部接口:

    interface Visitor<V> {boolean visit(V v);}

代码实现如下:

    public void bfs(V begin, Visitor<V> visitor) {// 根据值获取起始顶点Vertex<V, E> beginVertex = vertices.get(begin);if(Objects.isNull(beginVertex)) {return;}Queue<Vertex<V, E>> queue = new LinkedList<>();Set<Vertex<V, E>> visitedVertices  = new HashSet<>(); // 记录已经添加入队列中的顶点queue.offer(beginVertex);visitedVertices.add(beginVertex);while (!queue.isEmpty()) {Vertex<V, E> vertex = queue.poll();// 返回true终止遍历if(visitor.visit(vertex.value)) {return;}vertex.outEdges.forEach(edge -> {if(!visitedVertices.contains(edge.toVertex)) {queue.offer(edge.toVertex);visitedVertices.add(edge.toVertex);}});}}

深度优先搜索

深度优先搜索:从起始节点沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者无法继续往下搜索时,搜索将回溯到发现节点v的那条边的起始节点,整个进程反复进行直到所有节点都被访问为止。二叉树的前序遍历就是一种深度优先搜索。

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

递归实现

    public void dfs(V begin, Visitor<V> visitor) {// 根据值获取起始顶点Vertex<V, E> beginVertex = vertices.get(begin);if(Objects.isNull(beginVertex)) {return;}// 递归调用dfs(beginVertex, visitor, new HashSet<>());}// dfs返回true,中断遍历private boolean dfs(Vertex<V, E> vertex, Visitor<V> visitor, Set<Vertex<V, E>> visitedVertices) {if(visitor.visit(vertex.value)) {return true;}visitedVertices.add(vertex);Iterator<Edge<V, E>> iterator = vertex.outEdges.iterator();while (iterator.hasNext()) {Edge<V, E> edge = iterator.next();if(!visitedVertices.contains(edge.toVertex)) {if(dfs(edge.toVertex, visitor, visitedVertices)) {return true;}}}return false;}

迭代实现

    public void dfs(V begin, Visitor<V> visitor) {// 根据值获取起始顶点Vertex<V, E> beginVertex = vertices.get(begin);if (Objects.isNull(beginVertex)) {return;}Set<Vertex<V, E>> visitedVertices = new HashSet<>();Stack<Vertex<V, E>> stack = new Stack<>();stack.push(beginVertex);visitedVertices.add(beginVertex);if(visitor.visit(beginVertex.value)) {return;}while (!stack.isEmpty()) {Vertex<V, E> vertex = stack.pop();Iterator<Edge<V, E>> iterator = vertex.outEdges.iterator();while (iterator.hasNext()) {Edge<V, E> edge = iterator.next();if(!visitedVertices.contains(edge.toVertex)) {stack.push(vertex);stack.push(edge.toVertex);visitedVertices.add(edge.toVertex);if(visitor.visit(edge.toVertex.value)) {return;}break;}}}}

更多精彩内容关注本人公众号:架构师升级之路
在这里插入图片描述


http://chatgpt.dhexx.cn/article/V99BHUuw.shtml

相关文章

实现有多个图片的遍历显示react

如图要想实现这个效果&#xff0c;首先这些图片是存储在一个数组中的&#xff0c;我们要取出图片然后遍历显示出来&#xff0c;可以如下显示&#xff1a; render : ( text) > { if ( text && text. length) { const imgs text. map(( item, index) > < div k…

vue3循环遍历图片渲染无效果

图片路径以及当前组件&#xff1a; 需要遍历的图片数据&#xff1a; 循环遍历展示图片&#xff1a;&#xff08;注释部分也是可以渲染出来&#xff09; 注意&#xff1a; 绑定的图片路径必须写成src开头&#xff0c;也就是根目录, 路径写成"../../assets/situation/item…

OpenCV图像像素遍历与访问

遍历方式有很多种&#xff0c;下面给出两种方式&#xff1a; 基于数组遍历基于指针遍历 1、基于数组遍历 Mat类中的cols、rows为图像的宽、高。成员函数at(row,col)可以存取图像元素。对于包含彩色图像的Mat&#xff0c;OpenCV中将三个8位数组组成的向量定义为Vec3b。 访问彩…

图的遍历方法

从图中某一顶点出发访遍图中其余顶点&#xff0c;且使每一个顶点仅被访问一次&#xff0c;这一过程就叫做图的遍历&#xff08;Traversing Graph&#xff09; 访问过的顶点打上标记&#xff0c;避免访问多次而不自知&#xff1b;可以通过设置一个访问数组visited[n]&#xff0…

Html图片轮播遍历,js实现图片无缝循环轮播

本文实例为大家分享了js实现图片无缝循环轮播的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 代码如下Document #container{ overflow:hidden; width:400px; height:300px; margin:auto; } #front,#container{ display:flex; flex-direction:row; } #container img…

翻译:图数据库Apache TinkerPop Gremlin图遍历机器和语言

说明 Gremlin是Apache TinkerPop的图形遍历语言。Gremlin是一个功能&#xff0c;数据流 语言&#xff0c;使用户能够简洁地表达复杂的遍历&#xff08;或查询&#xff09;的应用程序的性能曲线图。每个Gremlin遍历都由一系列&#xff08;可能嵌套的&#xff09;步骤组成。步骤…

html递归遍历,图的深度遍历是一个递归过程

数据结构问题:图的深度优先遍历中有递归的应用,数据结构问题:图的深度优先遍历中有递归的应用,要用到栈,图中顶点是首先你得明白函数调用本身就是通过栈来实现的。 调用函数是入栈,而函数返回是出栈。 为什么是栈, 你要知道栈的特性是 “后进先出”或者是“先进后出”,…

networkx之图遍历和图绘制

networkx之图遍历和图绘制 文章目录 networkx之图遍历和图绘制图数据读取后默认标签&#xff08;labels&#xff09;为索引&#xff0c;如何使用编号id&#xff1f;图数据读取后&#xff0c;如何得到节点集和边集&#xff1f;如何绘制多样的图&#xff1f; 图数据读取后默认标签…

python-opencv如何遍历图片

使用背景 一个朋友&#xff0c;需要查看鸡蛋是否有裂纹&#xff0c;如下图所示&#xff1a; 之后通过python-opencv处理成为了如下结果&#xff1a; 如上图所示&#xff0c;通过canny轮廓提取得到了左图所示轮廓&#xff0c;通过阈值分割得到右图所示裂纹&#xff0c;此时需要…

图形的遍历

一个图形G(V,E)&#xff0c;存在某一顶点v&#xff0c;希望从v开始&#xff0c;通过此顶点相邻的顶点而去访问G中其他顶点直达全部的顶点遍历完毕。在遍历的过程中可能会重复经过某些顶点及边线&#xff0c;经由图形的遍历可以判断该图形是否连通&#xff0c;并找出连通单元和路…

图遍历详解(C语言版)

文章目录 一、定义二、方法1、深度优先遍历2、广度优先遍历 三、实现1、无向图或强连通有向图遍历2、非连通图遍历 结语附录 一、定义 从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中所有顶点&#xff0c;使每…

记录在遍历数据时,如何将数据的每一项中的个图片遍历出来

场景&#xff1a;商品评价页面&#xff0c;需将每一条评价显示出来&#xff0c;有图片评价的也要将图片显示出来 后端返回的接口数据格式如下&#xff1a; 如果是一张图片&#xff0c;在遍历外层的时候&#xff0c;用item.discuss_img就可以直接显示出来了&#xff0c;但多张图…

小程序轮播图遍历图片的方法

uniapp轮播图组件 方法一&#xff1a;直接使用图片 <swiper :indicator-dots"true" :autoplay"true" :interval"3000" :duration"1000" :circular"true"><swiper-item><image src"/static/swiper_img/…

图遍历算法

上一篇文章中我们简单介绍了什么是图和图分析&#xff0c;图分析的应用场景和优点&#xff0c;以及一些常用的图工具&#xff0c;这篇文章里将介绍一下简单的图遍历算法。 图的遍历 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发…

图的遍历(基础)

目录 一、图的遍历的相关定义 二、深度优先搜索 &#xff08;一&#xff09;深度优先搜索连通子图的基本思想 &#xff08;二&#xff09;采用递归的形式说明&#xff0c;则深度优先搜索连通子图的基本思想&#xff1a; &#xff08;三&…

图的遍历(深度优先遍历,DFS)

1.概念 图的遍历操作是从图中某一顶点出发&#xff0c;对图中所有顶点访问一次且仅访问一次 &#xff08;1&#xff09;在图中&#xff0c;遍历的起始顶点是编号最小的顶点 &#xff08;2&#xff09;某个起点到达不了所有顶点&#xff0c;则多次调用访问所有顶点 &#xf…

数据结构 第六章 图——图的遍历

6.5 图的遍历 在前面我们知道&#xff0c;树是一种非线性结构&#xff0c;为了方便它在计算机中的存储&#xff0c;对树进行遍历使它线性化。 而图同样也是一种非线性结构&#xff0c;但是图又是一种不同于树的多对多结构&#xff0c;所以在前面我们将其转换为了多个一对多的结…

数据结构——图(图的遍历)

图的遍历 图的遍历深度优先遍历&#xff08;DFS&#xff09;DFS算法效率分析深度优先遍历算法的实现广度优先搜索遍历&#xff08;BFS&#xff09;BFS算法效率分析DFS与BFS算法比较 图的遍历 遍历定义&#xff1a;从已给的连通图中某一顶点出发&#xff0c;沿着一些边访遍图中所…

图的遍历 (深度优先遍历和广度优先遍历)

一. 什么是深度优先遍历 深度优先遍历可定义如下&#xff1a;首先访问出发点v&#xff0c;并将其标记为已访问过&#xff1b;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过&#xff0c;则以w为新的出发点继续进行深度优先遍历&#xff0c;直至图中所有和源点v有路径相通的…

图的遍历

图的遍历 介绍 是从图的某一顶点出发&#xff0c;按照某种搜索方式对图中所有顶点访问一次且仅一次。图的遍历可以解决很多搜索问题&#xff0c;在实际中应用非常广泛。图的遍历根据搜索方式的不同&#xff0c;分为广度优先搜索和深度优先搜索。 一.深度优先遍历 1.1介绍 深…