数据结构——第四章图:03图的遍历
1.图的遍历:从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。有两种遍历方式:深度优先遍历、广度优先遍历。
2.深度优先搜索遍历图:
(1)连通图的深度优先搜索遍历:从图中某个顶点v0出发,访问此顶点,然后依次从v0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v0有路径相同的顶点都被访问到。
void DFS(Graph G, int v) //从顶点v出发,深度优先搜索遍历连通图G
{
visited[v] = TRUE;
VisitFunc(v);
for (w = FirstAdjVex(G, v); w != 0; w = NextAdjVex(G, v, w))
{
if (!visited[w]) //对v的未访问过的邻接点w递归调用DFS
{
DFS(G, w);
}
}
}
(2)非连通图的深度优先搜索遍历:首先将图中每个顶点的访问标志设为FALSE,之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一个顶点。
void DFSTraverse(Graph G, int v) //对图G做深度优先遍历
{
for (v = 0; v < G.vexnum; ++v)
{
visited[v] = FLASE; //访问标志数组初始化
}
for (v = 0; v < G.vexnum; ++v)
{
if (!visited[v]) //对未访问过的顶点调用DFS
{
DFS(G, v);
}
}
}
3.广度优先搜索遍历图:从图中的某个顶点v0出发,并在访问此顶点之后依次访问v0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和v0有路径相通的顶点都被访问到。若此时图中还有顶点未被访问,则另选图中一个未曾被访问的顶点做起始点,重复上述过程,直至图中所有顶点都被访问到为止(类似于树的层序遍历)。
void BFSTraverse(Graph G, int v)
{
for (v = 0; v < G.vexnum; v++)
{
visited[v] = FALSE; //初始化访问标志
}
InitQueue(Q); //置空的辅助队列Q
for (v = 0; v < G.vexnum; v++)
{
if (!visited[v]) //v未被访问
{
visited[v] = TRUE;
visit(v); //访问v
EnQueue(Q, v); //v入队列
while (!QueueEmpty(Q))
{
DeQueue(Q, u); //队头元素出队并置为u
for(w = FirstAdjVex(G, u); w != 0; w = NextAdjVex(G, u, w))
{
if (!visited[w])
{
visited[w] = TRUE;
visit(w);
EnQueue(Q, w); //访问的顶点w入队列
}
}
}
}
}
}