Szélesség-első keresés - BFS-grafikon átjárási útmutató 3 Leetcode-példával

A Breadth First Search (BFS) az egyik legnépszerűbb algoritmus egy fa vagy grafikon adatszerkezetének keresésére vagy áthaladására. Ebben az oktatóanyagban röviden megismerhetjük a BFS működését, és feltárhatunk egy alapmintát, amely felhasználható néhány közepes és könnyű probléma megoldására a Leetcode-ban.

Kezdjük, ugye?

Mi a Breadth First Search?

Tehát mindannyian tudjuk, hogy a gráf csúcsok és élek halmaza: G = {V, E}. A grafikonon való áthaladás azt jelenti, hogy minden csúcsot és élt pontosan egyszer , rendezett módon kell meglátogatni .

A BFS-ben a gráfot szélességenként vagy szintenként kell haladnunk. Ez azt jelenti, hogy először vízszintesen haladunk, és meglátogatjuk az aktuális réteg összes csomópontját, mielőtt továbblépnénk a következő rétegre.

Ezért, amikor felkérést kapunk valamilyen szintű sorrendbeli bejárásra, használhatjuk a BFS technikát.

A BFS-ben 1-től kezdve (a gyökércsomópont) kezdtük volna meg az utat, és meglátogattuk a gyermek 8, 5 és 2 gyermekcsomópontjait. Tároljuk őket abban a sorrendben, amelyben meglátogattuk őket. Ez lehetővé tenné számunkra, hogy először meglátogassuk a 8 (azaz 6, 4 és 3), majd az 5 (azaz null), majd a 2 (azaz 9) gyermek csomópontjait.

Végrehajtás

A BFS megvalósításához egy sor adatstruktúrát használnak. A sor tárolja a csomópontot, és „meglátogatottként” jelöli, amíg az összes szomszédos csúcsa meg nem jelenik.

A sor a First In First Out (FIFO) módszert követi. Ez azt jelenti, hogy a csomópont szomszédait a beszúrás sorrendjében keressük fel.

BFS varázslat:

  1. Adjon hozzá egy csomópontot a sorba
  2. Távolítsa el a csomópontot
  3. Szerezze be az eltávolított csomópont nem látogatott szomszédait, és adja hozzá őket a várólistához
  4. Ismételje meg az 1., 2. és 3. lépést, amíg a sor nem üres.

Most nézzünk meg néhány Leetcode problémát, és alkalmazzuk a tanultakat.

102. Bináris faszintű rend bejárása (nehézség: közepes)

A kérdés arra kér bennünket, hogy lépjünk át a grafikonon, és minden csomópontot kinyomtassunk egy csatolt listában. Ennek megoldásához mindössze annyit kell tennünk, hogy alkalmazzuk a varázsigét!

Ügyeljen arra, hogy jól megértse a kódot, mivel ez az az alapvető sablon, amelyet több probléma megoldására használunk. Tehát menjünk át rajta.

A fenti kódba először beillesztettük a gyökércsomópontot a sorba. Noha a sor nem üres, eltávolítottuk ezt a csomópontot a sorból, és beillesztettük a bal és jobb gyermekét a sorba.

De előtte ellenőriztük, hogy minden gyermeke semmis-e vagy sem. Ha null, akkor kaptunk volna egy Null Pointer kivételt.

A folyamat megismétlődik a sorban maradt következő elemekkel. A for hurokfenntartja, hogy minden csomópont listáját külön összekapcsolt listákban adja meg nekünk.

637. A bináris fa szintjeinek átlaga (nehézség: könnyű)

Ez a kérdés azt mondja, hogy meg kell találni a csomópontok átlagos értékét egy tömb bináris fa minden szintjén. Ez ugyanazt az eljárást követi, mint az előző problémánk egy kis csípéssel.

Mint láthatja, csak a sablonkód másolását és beillesztését tettük. Ezután egyszerűen teszünk egy összegváltozót a for ciklusba, amely megadhatja az egyes szintek csomópontértékeinek összegét. Ezt fogjuk használni a kívánt átlagunk kiszámításához.

429. N-ary fa szintű rendbejárás (nehézség: közepes)

Egy olyan fát, amelyben minden csomópontban legfeljebb N gyermek van, N-ágnak nevezzük.

Ez pontosan ugyanazt az eljárást követi, mint egy bináris fa bejárása, kivéve azt a tényt, hogy ide beillesztjük a csomópont összes gyermekét a sorba. Ne feledje, hogy a bináris fával kapcsolatos problémák megoldása közben csak az adott csomópont bal és jobb gyermekét illesztettük be a sorba.

Ez minden! Remélem, hogy ez segített jobban megérteni a BFS-t, és hogy élvezte az oktatóanyagot. Kérjük, ajánlja ezt a bejegyzést, ha úgy gondolja, hogy másnak is hasznos lehet!