Bredde-første søgning - En BFS-grafgennemgangsguide med 3 Leetcode-eksempler

Breadth First Search (BFS) er en af ​​de mest populære algoritmer til søgning eller gennemkørsel af et træ eller en grafdatastruktur. I denne vejledning lærer vi kort hvordan BFS fungerer og udforsker et grundlæggende mønster, der kan bruges til at løse nogle mellemstore og lette problemer i Leetcode.

Lad os komme i gang, skal vi?

Hvad er bredde første søgning?

Så vi ved alle, at en graf er et sæt hjørner og kanter: G = {V, E}. At krydse en graf betyder at besøge hvert toppunkt og hver kant nøjagtigt en gang på en ordnet måde.

I BFS kræves det, at vi krydser grafen bredt eller niveauvis. Dette betyder, at vi først bevæger os vandret og besøger alle noderne i det aktuelle lag, inden vi går videre til det næste lag.

Derfor, når vi bliver bedt om at foretage en vis ordrepasning, kan vi bruge BFS-teknikken.

I BFS begynder vi at krydse fra 1 (rodnoden) og besøge dets underknudepunkter 8, 5 og 2. Vi gemmer dem i den rækkefølge, de blev besøgt i. Dette vil give os mulighed for først at besøge barneknudepunkterne på 8 (dvs. 6, 4 og 3), derefter på 5 (dvs. null) og derefter på 2 (dvs. 9) og så videre.

Implementering

For at implementere BFS bruges en kødatastruktur . Køen gemmer noden og markerer den som 'besøgt' indtil alle dens tilstødende hjørner er markeret.

Køen følger metoden First In First Out (FIFO). Dette betyder, at naboens noder vil blive besøgt i den rækkefølge, de blev indsat i.

BFS magisk trylleformular:

  1. Føj en knude til køen
  2. Fjern node
  3. Hent ubesøgte naboer til den fjernede knude, føj dem til køen
  4. Gentag trin 1, 2 og 3, så længe køen ikke er tom.

Lad os nu se på nogle Leetcode-problemer og anvende det, vi har lært.

102. Gennemgang af rækkefølge for binært træniveau (vanskelighed: medium)

Spørgsmålet beder os om at krydse grafen og udskrive noderne på hvert niveau i en sammenkædet liste. For at løse denne er alt, hvad vi skal gøre, at anvende vores magiske magi!

Sørg for at forstå koden godt, da dette er den grundlæggende skabelon, vi bruger til at løse flere problemer. Så lad os gå igennem det.

I koden ovenfor har vi først indsat rodnoden i køen. Mens køen ikke er tom, har vi fjernet denne node fra køen og indsat dens venstre og højre barn i køen.

Men før det kontrollerede vi, om hvert af dets børn er nul eller ej. Hvis null, ville vi have fået en Null Pointer Exception.

Processen gentages igen med de næste elementer, der forbliver i køen. For- løkkenopretholdes for at give os listen over noder på hvert niveau i separate sammenkædede lister.

637. Gennemsnit af niveauer i et binært træ (vanskelighed: let)

Dette spørgsmål fortæller os, at vi finder den gennemsnitlige værdi af noder på hvert niveau af et binært træ i en matrix. Dette følger den samme procedure som vores tidligere problem med lidt tweak.

Som du kan se, var alt, hvad vi gjorde, kopiere og indsætte skabelonkoden. Derefter placerer vi simpelthen en sumvariabel inden for for-sløjfen, der kan give os summen af ​​nodeværdierne på hvert niveau. Dette er hvad vi vil bruge til at beregne vores ønskede gennemsnit.

429. Gennemsnitlig rækkefølge i træniveau (vanskelighed: medium)

Et træ, hvor hver knude ikke har mere end N antal børn, kaldes et N-ar træ.

Dette følger nøjagtigt den samme procedure som gennemgangen af ​​et binært træ, bortset fra det faktum, at her indsætter vi alle børnene til en node i køen. Husk, at mens vi løser problemer relateret til binært træ, har vi kun indsat venstre og højre børn af en given knude i køen.

Det er alt! Jeg håber, dette har hjulpet dig med at forstå BFS bedre, og at du har haft vejledningen. Anbefal dette indlæg, hvis du tror, ​​det kan være nyttigt for en anden!