数据结构之图的遍历

文章目录

广度优先遍历

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

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

  • 先将三个抽屉打开,在最外层找一遍
  • 将每个抽屉中红色的盒子打开,再找一遍
  • 将红色盒子中绿色盒子打开,再找一遍直到找完所有的盒子
  • 广度优先遍历需要借助一个队列和一个标记数组,利用队列先进先出的特点实现一层一层向外遍历,利用标记数组来记录各个顶点是否被访问过。
  • 刚开始时将起始顶点入队列,并将起始顶点标记为访问过,然后不断从队列中取出顶点进行访问,并判断该顶点是否有邻接顶点,如果有邻接顶点并且该邻接顶点没有被访问过,则将该邻接顶点入队列,并在入队列后立即将该邻接顶点标记为访问过。
cpp 复制代码
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);
			}
		}
	}
}

深度优先遍历

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

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

  • 先将第一个抽屉打开,在最外层找一遍
  • 将第一个抽屉中红盒子打开,在红盒子中找一遍
  • 将红盒子中绿盒子打开,在绿盒子中找一遍
  • 递归查找剩余的两个盒子

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

  • 深度优先遍历可以通过递归实现,同时也需要借助一个标记数组来记录各个顶点是否被访问过。
  • 从起始顶点处开始进行递归遍历,在遍历过程中先对当前顶点进行访问,并将其标记为访问过,然后判断该顶点是否有邻接顶点,如果有邻接顶点并且该邻接顶点没有被访问过,则递归遍历该邻接顶点。
cpp 复制代码
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);
}
相关推荐
<但凡.1 小时前
数据结构与算法之美:广义表
数据结构·c++·算法
程序员Xu2 小时前
【OD机试题解法笔记】连续出牌数量
笔记·算法·深度优先
偷偷的卷3 小时前
【算法笔记 day three】滑动窗口(其他类型)
数据结构·笔记·python·学习·算法·leetcode
凤年徐3 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
kualcal3 小时前
代码随想录17|二叉树的层序遍历|翻转二叉树|对称二叉树
数据结构·算法
钮钴禄·爱因斯晨4 小时前
C语言 | 函数核心机制深度解构:从底层架构到工程化实践
c语言·开发语言·数据结构
努力写代码的熊大5 小时前
链式二叉树数据结构(递归)
数据结构
yi.Ist5 小时前
数据结构 —— 键值对 map
数据结构·算法
爱学习的小邓同学5 小时前
数据结构 --- 队列
c语言·数据结构
s153355 小时前
数据结构-顺序表-猜数字
数据结构·算法·leetcode