Jak vytisknout všechny listové uzly binárního stromu zleva doprava v JavaScriptu?

Jak Vytisknout Vsechny Listove Uzly Binarniho Stromu Zleva Doprava V Javascriptu



Binární strom se skládá z více uzlů, které jsou propojeny pomocí vrcholů, přičemž každý uzel může být spojen s nejvýše dvěma podřízenými uzly, které jsou známé jako jeho podřízené uzly. Pokud „ uzel “ nemá žádný nadřazený uzel, ale obsahuje některé podřízené uzly, které mají uzly vnuka, pak se nazývá „ vykořenit “uzel. Uzel je „ vnitřní ” uzel, pokud má nadřazený uzel a podřízený uzel. ' list ” uzel má nadřazený uzel, ale žádný podřízený uzel znamená uzly, které jsou slepou uličkou.

Vizuální znázornění diskutovaných konceptů je znázorněno na obrázku níže:







Tato příručka vysvětluje proces tisku všech listových uzlů binárního stromu tím, že pokryje níže uvedené části:



Jak identifikovat uzly listů?

' list 'uzly jsou ty, které nemají žádné podřízené uzly, nebo konkrétně, které mají ' výška “ z “ 0 “. Pokud má uzel „ výška ' větší než ' 0 ” pak tento uzel může být vnitřním nebo kořenovým uzlem. ' list ” uzly jsou obvykle zpětně sledovány, aby se identifikoval původní zdroj, odkud je tento uzel generován. Většinou se používá v algoritmech vyhledávání nebo hledání chyb k nalezení příčiny chyby nebo problému.



Jak vytisknout všechny listové uzly binárního stromu zleva doprava v JavaScriptu?

Jsou dva přístupy' rekurzivní ' a ' iterativní “ pro výběr všech listových uzlů dostupných v poskytnutém binárním stromu v požadovaném “ vlevo, odjet “ až “ že jo “směr. Praktická implementace těchto přístupů je demonstrována v níže uvedených částech:





Metoda 1: Tisk všech listových uzlů binárního stromu zleva doprava rekurzivně

Rekurzivní přístup vybere všechny uzly v a hloubkový vyhledávací algoritmus způsobem, který nejprve projde celé levé postranní uzly, poté střední uzel a nakonec pravé postranní uzly. Tato operace se provádí rekurzivně pro každý uzel a pokud již nedochází k dalšímu procházení „ list “ jsou identifikovány uzly. Chcete-li lépe porozumět tomuto konceptu, navštivte níže uvedený fragment kódu:

třída Uzel
{
konstruktér ( )
{
tento . obsah = 0 ;
tento . vlevo, odjet = nula ;
tento . že jo = nula ;
}
} ;

kde displayLeafNodes = ( rootNode ) =>
{
-li ( rootNode == nula )
vrátit se ;

-li ( rootNode. vlevo, odjet == nula && rootNode. že jo == nula )
{
dokument. napsat ( rootNode. obsah + '' ) ;
vrátit se ;
}

-li ( rootNode. vlevo, odjet != nula )
displayLeafNodes ( rootNode. vlevo, odjet ) ;
-li ( rootNode. že jo != nula )
displayLeafNodes ( rootNode. že jo ) ;
}
byl sampleNode = ( val ) =>
{
byl tempNode = Nový Uzel ( ) ;
tempNode. obsah = val ;
tempNode. vlevo, odjet = nula ;
tempNode. že jo = nula ;
vrátit se tempNode ;
}
byl rootNode = provNode ( 3 ) ;
rootNode. vlevo, odjet = provNode ( 6 ) ;
rootNode. že jo = provNode ( 9 ) ;
rootNode. vlevo, odjet . vlevo, odjet = provNode ( 12 ) ;
rootNode. vlevo, odjet . že jo = provNode ( patnáct ) ;
rootNode. vlevo, odjet . že jo . že jo = provNode ( 24 ) ;
rootNode. že jo . vlevo, odjet = provNode ( 18 ) ;
rootNode. že jo . že jo = provNode ( dvacet jedna ) ;

displayLeafNodes ( rootNode ) ;

Vysvětlení výše uvedeného bloku kódu je uvedeno níže:



  • Nejprve vytvořte třídu s názvem „ uzel “, který vytvoří nový uzel a nastaví jeho hodnotu na „ 0 “. Přiložený „ vlevo, odjet ' a ' že jo 'boční uzly jsou nastaveny na' nula ” ve výchozím nastavení pomocí konstruktoru třídy.
  • Dále definujte „ displayLeafNodes() 'funkce, která přijímá jeden parametr ' rootNode “. Tato parametrická hodnota je považována za aktuálně vybraný uzel binárního stromu.
  • Uvnitř funkce je „ -li “ se používá ke kontrole, zda „ rootNode “ je nulové nebo ne. V případě ' nula ” další provádění se pro tento uzel zastavilo. V druhém případě rootNode ' vlevo, odjet ' a ' že jo 'postranní uzly jsou kontrolovány na' nula “. Pokud jsou oba nulové, hodnota tohoto „ uzel “ se vytiskne.
  • Pokud „ vlevo, odjet “ nebo „ že jo “ uzel není „null“, pak předejte tuto stranu uzlu do „ displayLeafNodes() ” funkce pro rekurzivní operaci.
  • Definujte novou funkci s názvem „ provNode() “, který přijímá jediný parametr „ val “. Uvnitř funkce vytvořte novou instanci „ Uzel “třída s názvem “ tempNode “. Přiřaďte parametrické „ val ' jako hodnotu pro vlastnost třídy ' obsah “ a nastavte „ vlevo, odjet ' a ' že jo 'postranní uzly k' nula ' ve výchozím stavu.
  • Nakonec vytvořte objekt s názvem „ rootNode ' pro ' provNode() ” a předejte hodnotu uzlu jako tento parametr funkce. Vytvořte levý a pravý boční uzel přidáním „ vlevo, odjet ' a ' že jo ” klíčová slova s ​​“rootNode” a přiřaďte jim hodnotu pomocí stejné funkce “ provNode() “.
  • ' vlevo, odjet “ znamená levou pozici kořenového uzlu a „ vlevo.vlevo ” pozice znamená vlevo od leva stejný přístup je použit v případě ” že jo ' a ' že jo
  • Po definování stromu předejte „rootNode“ jako argument pro „ displayLeadNodes() ” pro výběr a tisk všech listových uzlů vytvořeného stromu.

Výstup vygenerovaný po kompilaci potvrzuje, že listový uzel poskytnutého stromu byl načten a vytištěn přes konzolu:

Metoda 2: Tisk všech listových uzlů binárního stromu pomocí iterativního přístupu

' iterativní “ přístup je nejúčinnější přístup, používá koncept “ TAM ' a ' pop “ pro výběr „ list “uzly. Klíčové body nebo fungování tohoto přístupu jsou uvedeny níže:

třída Uzel
{
konstruktér ( hodnota )
{
tento . data = hodnota ;
tento . vlevo, odjet = nula ;
tento . že jo = nula ;
}
} ;

kde displayLeafNodes = ( rootNode ) =>
{
-li ( ! rootNode )
vrátit se ;
nechat seznam = [ ] ;
seznam. TAM ( rootNode ) ;

zatímco ( seznam. délka > 0 ) {
rootNode = seznam [ seznam. délka - 1 ] ;
seznam. pop ( ) ;
-li ( ! rootNode. vlevo, odjet && ! rootNode. že jo )
dokument. napsat ( rootNode. data + '' ) ;
-li ( rootNode. že jo )
seznam. TAM ( rootNode. že jo ) ;
-li ( rootNode. vlevo, odjet )
seznam. TAM ( rootNode. vlevo, odjet ) ;
}
}

byl rootNode = Nový Uzel ( 3 ) ;
rootNode. vlevo, odjet = Nový Uzel ( 6 ) ;
rootNode. že jo = Nový Uzel ( 9 ) ;
rootNode. vlevo, odjet . vlevo, odjet = Nový Uzel ( 12 ) ;
rootNode. vlevo, odjet . že jo = Nový Uzel ( patnáct ) ;
rootNode. vlevo, odjet . že jo . že jo = Nový Uzel ( 24 ) ;
rootNode. že jo . vlevo, odjet = Nový Uzel ( 18 ) ;
rootNode. že jo . že jo = Nový Uzel ( dvacet jedna ) ;

displayLeafNodes ( rootNode ) ;

Vysvětlení výše uvedeného kódu je napsáno níže:

  • Nejprve vytvořte „ Uzel 'třída, která přijímá jeden parametr' hodnota ” která je nastavena jako hodnota nově vytvořeného uzlu a levá a pravá strana jsou nastaveny na hodnotu null. Stejně jako ve výše uvedeném příkladu.
  • Dále vytvořte funkci ' displayLeafNodes() “, který přijímá jediný parametr „ rootNode “. Tento „rootNode“ je považován za binární strom a nejprve je zkontrolována jeho prázdnota.
  • Pokud uzel není prázdný, zobrazí se prázdný seznam s názvem „ seznam “ je vytvořen a „ rootNode “ se do něj vloží pomocí “ TAM() “ metoda.
  • Poté, „ zatímco() ” se používá, který se provádí do délky “ seznam “. Uvnitř smyčky je prvek umístěný ve spodní části stromu nebo „ seznam “ se odstraní pomocí “ pop() “ metoda.
  • Nyní existence „ vlevo, odjet ' a ' že jo ” strany „rootNode“ jsou zaškrtnuté, a pokud obě strany neexistují, znamená to, že nemá žádný podřízený uzel. Poté se tento uzel zobrazí na obrazovce a identifikuje se jako listový uzel.
  • Pokud je uzel na levé nebo pravé straně, znamená to, že má děti. Pak to ' vlevo, odjet ' a ' že jo 'uzel je zatlačen do ' seznam ” pro další operaci hledání listového uzlu.
  • Nakonec vytvořte vlastní binární strom předáním hodnot uzlů jako parametrů pro „ Uzel ” konstruktor třídy. Po vytvoření předejte strom „rootNode“ jako argument pro „ displayLeafNodes() funkce “.

Výstup generovaný po kompilaci ukazuje, že jsou vytištěny listové uzly poskytnutého stromu:

Bonusový tip: Tisk listových uzlů binárního stromu zprava doleva

Chcete-li načíst všechny listové uzly, které nemají žádné podřízené uzly v „ že jo “ až “ vlevo, odjet “ směru, rekurzivní přístup je nejvíce doporučován kvůli jeho jednoduchosti. Například stejný strom diskutovaný ve výše uvedených částech bude použit k načtení listového uzlu, ale v „ že jo “ na “ vlevo, odjet “směr, jak je znázorněno níže:

třída Uzel
{
konstruktér ( hodnota )
{
tento . data = hodnota ;
tento . vlevo, odjet = nula ;
tento . že jo = nula ;
}
} ;


funkce displayLeafNodes ( vykořenit )
{
-li ( vykořenit == nula )
{
vrátit se ;
}

-li ( vykořenit. vlevo, odjet == nula && vykořenit. že jo == nula )
{
dokument. napsat ( vykořenit. data + '' ) ;
vrátit se ;
}
-li ( vykořenit. že jo != nula )
{
displayLeafNodes ( vykořenit. že jo ) ;
}
-li ( vykořenit. vlevo, odjet != nula )
{
displayLeafNodes ( vykořenit. vlevo, odjet ) ;
}
}


byl rootNode = Nový Uzel ( 3 ) ;
rootNode. vlevo, odjet = Nový Uzel ( 6 ) ;
rootNode. že jo = Nový Uzel ( 9 ) ;
rootNode. vlevo, odjet . vlevo, odjet = Nový Uzel ( 12 ) ;
rootNode. vlevo, odjet . že jo = Nový Uzel ( patnáct ) ;
rootNode. vlevo, odjet . že jo . že jo = Nový Uzel ( 24 ) ;
rootNode. že jo . vlevo, odjet = Nový Uzel ( 18 ) ;
rootNode. že jo . že jo = Nový Uzel ( dvacet jedna ) ;

displayLeafNodes ( rootNode ) ;

Výše uvedený kód funguje takto:

  • Nejprve třída ' Uzel ” je vytvořen, který používá výchozí konstruktor k přidání nového uzlu do stromu pouze odkazu provedeného ve výše uvedených příkladech.
  • Dále, „ displayLeadNodes() “ je vytvořena funkce, která přijímá jeden parametr „ rootNode “. Tento parametr je kontrolován na „ nula “podmínkou přes “ -li ' prohlášení.
  • Pokud zadaný uzel není pravdivý, pak jeho „ vlevo, odjet ' a ' že jo 'postranní uzly jsou kontrolovány na' nula “podmínka. Pokud jsou oba null, pak bude uzel identifikován jako „ list “ a vytisknout přes webovou stránku.
  • Poté předejte „ že jo ' a ' vlevo, odjet 'uzly' rootNode “ na “ displayLeafNodes() funkce “.
  • Přidělte pozici každého uzlu vytvořením instancí pomocí „ Nový klíčové slovo a Uzel() ” konstruktor a určení pozice jako parametr konstruktoru.
  • ' vlevo, odjet “ znamená levou pozici kořenového uzlu a „ vlevo.vlevo ” pozice znamená vlevo nebo vlevo. Stejný přístup je aplikován v případě „ že jo ' a ' že jo “.
  • Nakonec předejte „ rootNode “ jako argument pro „ displayLeafNode() funkce “.

Vygenerovaný výstup ukazuje, že listové uzly jsou vytištěny ve směru zprava doleva.

To je vše o tisku všech listových uzlů binárního stromu v libovolném požadovaném směru.

Závěr

Chcete-li vytisknout všechny listové uzly binárního stromu, vytvořte náhodnou třídu, která vytvoří a přiřadí hodnoty uzlům stromu. Dále vytvořte náhodnou funkci, která přijímá jeden uzel stromu v hierarchii shora dolů. Tato funkce obsahuje několik „ -li “ podmínky, které kontrolují, zda „ uzel “ není prázdné a nemá žádné uzly v “ vlevo, odjet ' a ' že jo “, pak je tento uzel považován za “ list ” a zobrazí se na konzole. Tato příručka vysvětluje postup tisku všech listových uzlů binárního stromu zleva doprava nebo zprava doleva.