图的遍历(DFS、BFS)

这篇博客详细介绍了图的两种遍历算法——深度优先遍历(DFS)和广度优先遍历(BFS)。通过邻接矩阵和邻接表两种数据结构,分别给出了DFS和BFS的递归及非递归实现。这些算法在图论和计算机科学中用于访问和搜索图的所有顶点。
摘要由CSDN通过智能技术生成

概念:从图的某一顶点出发访问图中的其余顶点,且使每个顶点只被访问一次

1、深度优先遍历(DFS)

typedef int Boolean;//布尔类型,值是TRUE或FALSE
Boolean visited[MAX];
//邻接矩阵的DFS递归算法
void DFS(MGraph, int i)
{
	int j;
	visited[i] = TRUE;//该顶点标记为已被访问
	printf("%c", G.vexs[i]);
	for (j = 0; j < G.numVertexes; j++)
		if (G.arc[i][j] == 1 && !visited[j])
			//有这个顶点,且顶点未被访问
			DFS(G, j);//对这个顶点递归
}
//邻接矩阵的DFS操作
void DFSTraverse(MGraph G)
{
	int i;
	for (i = 0; i < G.numVertexes; i++)
		visited[i] = FALSE;//所以顶点初始化为未访问
	for (i = 0; i < G.numVertexes; i++)
		if (!visited[i])
			DFS(G, i);

}
typedef int Boolean;//布尔类型,值是TRUE或FALSE
Boolean visited[MAX];
//邻接表的DFS递归算法
void DFS(GraphAdjList GL, int i)
{
	EdgeNode* p;
	visited[i] = TRUE;
	printf("%c",GL->adjList[i].data);
	p = GL->adjList[i].firstedge;
	while (p)
	{
		if (!visited[p->adjvex])
			DFS(GL, p->adjvex);
		p = p->next;//下一个结点
	}
}
//邻接表的DFS操作
void DFSTraverse(GraphAdjList)
{
	int i;
	for (i = 0; i < GL->numVertexes; i++)
		visited[i] = FALSE;
	for (i = 0; i < GL->numVertexes; i++)
		if (!visited[i])
			DFS(GL, i);
}

2、广度优先遍历(BFS)

//邻接矩阵的BFS算法
void BFSTraverse(MGraph.G)
{
	int i, j;
	Queue Q;
	for (i = 0; i < G.numVertexes; i++)
		visited[i] = FALSE;
	InitQueue(&Q);//初始化一个队列
	for (i = 0; i < G.numVertexes; i++)
	{
		if (!visited[i])
		{
			visited[i] = TRUE;
			printf("c", G.vexs[i]);
			EnQueue(&Q, i);//将该顶点入队
			while (!QueueEmpty(Q))//如果当前队列不为空
			{
				DeQueue(&Q, &i);//出队,把值赋给i
				for (j = 0; j < G.numVertexes; j++)
				{
					if(G.arc[i][j] == 1 && !visited[j])
					{
					//与当前顶点(i)相连且未被访问的顶点
					visited[j] = TRUE;
					printf("%c", G.vexs[j]);
					EnQueue(&Q, j);//入队
					}
				}
			}
		}
	}
}
//邻接表的BFS算法
void BFSTraverse(GraphAdjList GL)
{
	int i;
	EdgeNode* p;
	Queue Q;
	for (i = 0; i < GL->numVertexes; i++)
		visited[i] = FALSE;
	InitQueue(&Q);
	for (i = 0; i < GL->numVertexes; i++)
	{
		if (!visited[i])
		{
			visited[i] = TRUE;
			printf("c", GL->adjList[i].data);
			EnQueue(&Q, i);
			while (!QueueEmpty(Q))
			{
				DeQueue(&Q, &i);
				p = GL->adjList[i].firstedge;
				while(p)
				{
					if(!visited[p->adjvex])
					{
					//未被访问的顶点
					visited[p->adjvex] = TRUE;
					printf("%c", GL->adjList[p->adjvex].data);
					EnQueue(&Q, p->adjvex);//入队
					}
					p = p->next;
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值