理論部分
圖的深度遍歷和廣度遍歷都不算很難像極了二叉樹的前序遍歷和層序遍歷,如下面的圖,可以用右邊的鄰接矩陣進行表示,假設以頂點0開始對整幅圖進行遍歷的話,兩種遍歷方式的思想如下:
1. 深度優先遍歷(depthFirstSearch—DFS)
由初始頂點開始,沿着一條道一直走,當走到走不動的時候,再回來走一條可以走的通的道,然后再繼續往下走,直到走不動,再回來…對應於本圖來說就是從0開始往前走,到1----->然后從1再往前走,到5----->從5再往前走,到4------->到了這里發現沒路可走了------>就往回走,回到5,看5還有沒有路,發現沒路----->則回到1,看1有沒有路,也沒有----->再回到0,看0有沒有路,發現有------>則由0走到3----->走到這里發現又沒有路了----->再往回走,走到0,看0還有沒有路,發現有----->則由0走到4,但是4已經被遍歷過了,所以再回到0,結束這次遍歷過程
但是這時候還有一個2沒有遍歷啊,該怎么辦呢?之前我們是直接就默認從0開始進行往下遍歷了,但是從0開始遍歷沒有一條路可以走到2,為了避免這種情況,我們必須得從每一個頂點開始遍歷,這樣才能避免漏掉這種只出不進的頂點
於是深度優先遍歷得到的遍歷結果應為:0 1 5 4 3 2
2.廣度優先遍歷(broadFirstSearch—BFS)
廣度遍歷我覺得理解起來更簡單,就是一層一層的進行遍歷,比如說以0頂點開始,0往下指向1,3,4,遍歷的時候就先遍歷0,然后再遍歷它下一層的1,3,4------>然后分別遍歷1,3,4的下一層---->而1,3,4只有1有下一層,則遍歷1的下一層5,同理最后遍歷2
即廣度優先遍歷得到的遍歷結果應為:0 1 3 4 5 2
和二叉樹的層序遍歷一樣,圖的廣度遍歷也用到了隊列,對於下圖而言,先將0放入隊首----->然后遍歷0並將0從隊列中取出,同時將0的鄰接點1,3,4入隊,這樣隊首就是1----->然后將1出隊,並將1的鄰接點入隊(這里只有5), 這樣隊首就是3----->然后將3彈出並將3的鄰接點入隊(這里沒有),這樣隊首就是4----->然后將4彈出並將4的鄰接點入隊(這里沒有),隊首就是從1入隊的1的第一個鄰接點(這里是5)---->然后將5彈出----->直到隊列為空這樣就完成了由定點0開始的廣度優先遍歷