一,廣度優先遍歷,又稱爲廣度優先搜索,簡稱BFS。舉例說明,在一套房子裏找一個鑰匙,利用深度優先搜索就是搜索每一個房間,而廣度優先搜索,是先看看鑰匙有沒有放在各個房間的明顯位置,如果沒有,再看看各個房間的抽屜有沒有,這樣逐步擴大查找的範圍的方式我們稱之爲廣度優先搜索。
圖1 示例圖
從圖1中可以看到右邊的圖形看着很整潔好看,深度優先遍歷類似於樹的前序遍歷,廣度優先遍歷就類似於右邊的樹的層序遍歷,一層一層逐步往下直到遍歷完所有的頂點爲止。要是實現圖1中右邊的圖的遍歷,可以使用隊列來實現:
圖2 隊列實現圖
在圖2中可以看到,出隊列的順序就是ABFCIGEDH。
二,鄰接矩陣的廣度優先遍歷
//鄰接矩陣的廣度遍歷算法
void BFSTraverse(MGraph G) //傳進來一個圖G
{
int i,j;
Queue Q; //增加一個隊列
for( i=0; i<G.numVertexes; i++) //創建一個是否被訪問的標誌,numVertexes是記錄一個頂點數的元素
{
visited[i] = FALSE; //這個數組來存放是否被訪問的標誌,初始化爲FALSE
}
initQueue(&Q); //初始化隊列
for(i=0;i<G.numVertexes; i++)
{
if(!visited[i) //沒有被訪問過的時候才進行執行以下操作
{
printf("%c",G.vex[i]); //打印訪問的頂點
visited[i] = TRUE; //標誌爲已經訪問
EnQueue(&Q,i); //插入隊列
while(!QueueEmpty(Q) //建立一個迭代,只要隊列不爲空就進行循環迭代
{
DeQueue(&Q, &i); //彈出隊列,存放i這個變量裏面
for(j=0;j<G.numVertexes;j++)
{
if(G.art[i][j]==1 && !visited[j])//判斷說從i到j是否有邊連接起來,如果連接了即結果爲1.或者判斷j沒有被訪問過
{
printf("%c",G.vex[j]); //打印結點
visited[j] = TRUE; //標記爲已經訪問
EnQueue(&Q, j); //插入隊列
}
}
}
}
}
}
代碼具體的說明已經在程序註釋中寫的很清楚了。