深度优先遍历
深度优先遍历,也有称为深度优先搜索,简称为DFS。它从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问了。若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所以顶点都被访问到为止。
对于n个顶点e条边的图来说,邻接矩阵的时间是复杂度是O(NxN),邻接表的时间复杂度是O(n+e)。
typedef int Boolean;
Boolean visited[MAX];
//邻接矩阵的深度优先遍历
void DFS(MGraph G, 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);
}
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);
}
//邻接表的深度优先遍历
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;
}
}
void DFSTraverse(GraphAdjList GL)
{
int i;
for (i = 0; i < GL.numVertexes; i++)
visited[i] = FALSE;
for (i = 0; i < GL.numVertexes; i++)
if (!visited[i])
DFS(G, i);
}
广度优先遍历
广度优先遍历,又称为广度优先搜索,简称BFS。
如果说图的深度遍历类似于树的前序遍历,那么图的广度搜索就类似于树的层序遍历。
深度遍历更适合目标比较明确,以找到目标为主要目的的情况,而广度优先更适合在不断扩大遍历范围时找到相对最优解的情况。
typedef int Boolean;
Boolean visited[MAX];
//邻接矩阵的广度遍历
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);
for (j = 0; j < G.numVertexes; j++)
{
if (G.arc[i][j] == 1 && !visited[j])
{
visited[j] = TRUE;
printf("%c ", G.vexs[j]);
DeQueue(&Q, j);
}
}
}
}
}
}
//邻接表的广度遍历
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;
}
}
}
}
}