深度优先遍历(DFS)

思想:

一条路走到底,走到被访问过的结点,退回一个节点,遍历未访问的结点,重复此项工作。(遍历次序可能不同)
案例:根的先根遍历

代码(邻接矩阵)(连通图)

void DFS(AMGraph G,int v)//v起始顶点
{
    int Visited[AMGraph.vexnum];//辅助数组:记录节点有没有被访问过
    memset(Visited,0,sizeof(Visited));//0代表未访问过
   
    cout<<v ; Visited[v]=1;
    for(int w=0;w<G.vexnum;w++)
    {
        if(G.arcnum[v][w]!=0&&(!Visited[w]))
            DFS(G,w);
        //w是v的邻接点,如果w未访问,则递归调用DFS
    }
}

对于非连通图:遍历完一个连通分量后,再遍历另一个连通分量


广度优先搜索(BFS)

思想:

先访问完一个节点的所有邻接点,然后按照邻接点的被访问顺序,重复此过程,直到所有节点都被访问。

类似于:树的层次遍历

代码

void BFS(ALGraph G,int v)//非递归
{
    int visited[G.vexnum];//用作该节点有没有被访问过
    memset(visited,0,sizeof(visited));
    cout<<v;visited[v]=1;
    initQueue(Q);//初始化队列Q
    EnQueue(Q,v);//v进队
    while(!QueueEmpty(Q))//队列非空
    {
        DeQueue(Q,u);//队头元素出队并置为u
        for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
        {
            if(!visited[w])
            {
                cout<<w;visited[w]=1;
                EnQueue(Q,w);//w进队
            }
        }
    }
}

邻接矩阵时间复杂度:O(n²)
邻接表时间复杂度O(m+e)
空间复杂度O(n)