图之遍历--广度优先遍历
何為廣度優(yōu)先遍歷呢?
廣度優(yōu)先遍歷(BFS),又叫寬度優(yōu)先搜索或橫向優(yōu)先搜索,是從根結(jié)點(diǎn)開始沿著樹的寬度搜索遍歷,將離根節(jié)點(diǎn)最近的節(jié)點(diǎn)先遍歷出來(lái),在繼續(xù)深挖下去。
基本思想是:
1、從圖中某個(gè)頂點(diǎn)V0出發(fā),并訪問(wèn)此頂點(diǎn); 2、從V0出發(fā),訪問(wèn)V0的各個(gè)未曾訪問(wèn)的鄰接點(diǎn)W1,W2,…,Wk;然后,依次從W1,W2,…,Wk出發(fā)訪問(wèn)各自未被訪問(wèn)的鄰接點(diǎn); 3、重復(fù)步驟2,直到全部頂點(diǎn)都被訪問(wèn)為止。
下面給出廣度優(yōu)先遍歷的例子:(廣度優(yōu)先遍歷不是唯一的哦,只要滿足“廣度”的含義即可)
訪問(wèn)順序?yàn)?#xff1a;0,2,1,5,3,4(看圖很快就可得知)(將離根節(jié)點(diǎn)最近的節(jié)點(diǎn)先遍歷出來(lái),再繼續(xù)深挖下去。)
知道了BFS之后,我們又要怎么通過(guò)編程來(lái)實(shí)現(xiàn)BFS呢?
下面給上詳細(xì)的分析:
首先,先準(zhǔn)備一個(gè)隊(duì)列(利用隊(duì)列的結(jié)構(gòu))和一個(gè)Set(Set用來(lái)作為類似于注冊(cè)的作用,防止節(jié)點(diǎn)重復(fù)進(jìn)入隊(duì)列)
step1.先把根節(jié)點(diǎn)1放入隊(duì)列中,同時(shí)將1注冊(cè)到set中去,證實(shí)它進(jìn)過(guò)隊(duì)列(上面兩步是同步的)
step2.把1poll出來(lái),同時(shí)打印出來(lái)(System.out...)(前面兩步也是同步的),同時(shí)將1的所有next節(jié)點(diǎn)都放到隊(duì)列中去(放到隊(duì)列中去時(shí)要提前判斷這些元素之前是否有注冊(cè)過(guò),即有沒(méi)有在set中)
step3.如果一個(gè)節(jié)點(diǎn)已經(jīng)沒(méi)有next節(jié)點(diǎn)的時(shí)候,那就直接將該節(jié)點(diǎn)彈出去就行,不用注冊(cè)也不用添加到隊(duì)列中。
下面流程圖可以用來(lái)參考,下面也有源代碼,源代碼有注釋,很好理解,看不清楚的歡迎留言~
下面附上源代碼:
總結(jié)
以上是生活随笔為你收集整理的图之遍历--广度优先遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Git初学札记(五)————Branch
- 下一篇: 一篇读懂--mybatis的缓存