当前位置: 首页 > news >正文

数据结构之图的遍历

文章目录

  • 广度优先遍历
  • 深度优先遍历

广度优先遍历

广度优先遍历过程类似于二叉树的层序遍历,从起始顶点开始一层一层向外进行遍历

在这里插入图片描述

比如现在要找东西,假设有三个抽屉,东西在那个抽屉不清楚,现在要将其找到,广度优先遍历的做法是:

  • 先将三个抽屉打开,在最外层找一遍
  • 将每个抽屉中红色的盒子打开,再找一遍
  • 将红色盒子中绿色盒子打开,再找一遍直到找完所有的盒子

在这里插入图片描述

  • 广度优先遍历需要借助一个队列和一个标记数组,利用队列先进先出的特点实现一层一层向外遍历,利用标记数组来记录各个顶点是否被访问过。
  • 刚开始时将起始顶点入队列,并将起始顶点标记为访问过,然后不断从队列中取出顶点进行访问,并判断该顶点是否有邻接顶点,如果有邻接顶点并且该邻接顶点没有被访问过,则将该邻接顶点入队列,并在入队列后立即将该邻接顶点标记为访问过。
void BFS(const V& src) //图的广度优先遍历
{size_t srci = _index[src];//找到值src对应在数组中的下标queue<int> q;vector<bool> visited(_vertex.size(), false); //用来标记哪些元素已经入过队列了q.push(srci);visited[srci] = true;while (!q.empty()){int front = q.front();cout << front << ": " << _vertex[front] << endl;q.pop();//把这个顶点的朋友带入队列,并更新visited数组for (int i = 0; i < _vertex.size(); i++){//_matrix[front][i]代表front->i是否有边,数组值不等于MAX_W就代表它们之间直接相连if (_matrix[front][i] != MAX_W && visited[i] == false){visited[i] = true;q.push(i);}}}
}

深度优先遍历

深度优先遍历过程类似于二叉树的先序遍历,从起始顶点开始不断对顶点进行深入遍历

在这里插入图片描述
比如现在要找东西,假设有三个抽屉,东西在那个抽屉不清楚,现在要将其找到,广度优先遍历的做法是:

  • 先将第一个抽屉打开,在最外层找一遍
  • 将第一个抽屉中红盒子打开,在红盒子中找一遍
  • 将红盒子中绿盒子打开,在绿盒子中找一遍
  • 递归查找剩余的两个盒子
    在这里插入图片描述

深度优先遍历:将一个抽屉一次性遍历完(包括该抽屉中包含的小盒子),再去递归遍历其他盒子

  • 深度优先遍历可以通过递归实现,同时也需要借助一个标记数组来记录各个顶点是否被访问过。
  • 从起始顶点处开始进行递归遍历,在遍历过程中先对当前顶点进行访问,并将其标记为访问过,然后判断该顶点是否有邻接顶点,如果有邻接顶点并且该邻接顶点没有被访问过,则递归遍历该邻接顶点。
void _DFS(size_t srci, vector<bool>& visited)
{cout << srci << ":" << _vertexs[srci] << endl;visited[srci] = true;// 找一个srci相邻的没有访问过的点,去往深度遍历for (size_t i = 0; i < _vertexs.size(); ++i){if (_matrix[srci][i] != MAX_W && visited[i] == false){_DFS(i, visited);}}}void DFS(const V& src)
{size_t srci = GetVertexIndex(src);vector<bool> visited(_vertexs.size(), false);_DFS(srci, visited);
}

http://www.mrgr.cn/news/34569.html

相关文章:

  • #Swift Automatic Initializer Inheritance
  • Anaconda安装(2024最新版)
  • PostgreSQL 修改序列
  • FreeSWITCH的介绍及应用
  • VScode下脚本被禁止运行的原因及解决方案
  • Springboot 微信小程序定位后将坐标转换为百度地图坐标,在百度地图做逆地址解析
  • MySQL | 使用 HAVING 子句进行高级数据筛选
  • 数据链路层协议 —— 以太网协议
  • 如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像源解决群晖Docker获取注册表失败的问题)
  • 全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口
  • 代码随想录算法训练营Day11
  • JDK7u21 HashMap版
  • C++之STL—vector容器进阶篇
  • Spring源码学习:SpringMVC(2)DispatcherServlet初始化【子容器9大组件】
  • go解决引入私有包报错“Repository owner does not exist“的两种方式
  • 难题妙解——前K个高频单词
  • Vue从入门到精通:全方位掌握Vue.js开发技能
  • CF 461 B Appleman and Tree 题解(树形 dp+排列组合)
  • MySQL和SQL的区别简单了解和分析使用以及个人总结
  • 手写数字识别案例分析(torch,深度学习入门)
  • 看Threejs好玩示例,学习创新与技术(React-three-fiber)
  • 有空格输入
  • Java设计模式——工厂模式扩展
  • Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook
  • gtk安装和测试
  • 半导体芯闻--20240923