Cum să imprimați toate nodurile frunze ale unui arbore binar de la stânga la dreapta în JavaScript?

Cum Sa Imprimati Toate Nodurile Frunze Ale Unui Arbore Binar De La Stanga La Dreapta In Javascript



Un arbore binar constă din mai multe noduri care sunt conectate prin vârfuri, fiecare nod putând fi conectat cu cel mult două noduri copil care sunt cunoscute ca nodurile sale copil. Dacă „ nodul ” nu are nod părinte, dar conține câteva noduri copil care au noduri nepoți, apoi este cunoscut sub numele de „ rădăcină ” nod. Nodul este un „ interior ” nod dacă are nodul părinte și nodul copil. „ frunze ” nodul are un nod părinte, dar niciun nod copil înseamnă nodurile care sunt fundătură.

Reprezentarea vizuală a conceptelor discutate este prezentată în figura de mai jos:







Acest ghid explică procesul de tipărire a tuturor nodurilor frunze ale unui arbore binar, acoperind secțiunile menționate mai jos:



Cum să identifici nodurile frunzelor?

frunze ” nodurile sunt cele care nu au noduri copii sau, mai precis, care au “ înălţime ' de ' 0 ”. Dacă nodul are un „ înălţime ' mai mare ca ' 0 ” atunci acel nod poate fi nodul interior sau nodul rădăcină. „ frunze ” nodurile sunt de obicei inversate pentru a identifica sursa originală de unde este generat acest nod. Este folosit mai ales în algoritmii de căutare sau de găsire a erorilor pentru a găsi cauza unei erori sau probleme.



Cum să imprimați toate nodurile frunze ale unui arbore binar de la stânga la dreapta în JavaScript?

Există două abordări” recursiv ' și ' iterativ ” pentru a selecta toate nodurile frunze disponibile în arborele binar furnizat în „ stânga ' la ' dreapta ” direcție. Implementarea practică a acestor abordări este demonstrată în secțiunile menționate mai jos:





Metoda 1: Tipăriți recursiv toate nodurile frunze ale unui arbore binar de la stânga la dreapta

Abordarea recursivă selectează toate nodurile din a algoritmul de căutare în profunzime mod care traversează mai întâi toate nodurile din partea stângă, apoi nodul din mijloc și nodurile din partea dreaptă în final. Această operațiune este efectuată recursiv pentru fiecare nod și atunci când nu mai este parcurgerea „ frunze ” nodurile sunt identificate. Pentru a înțelege mai bine acest concept, accesați fragmentul de cod de mai jos:

clasă Nodul
{
constructor ( )
{
acest . conţinut = 0 ;
acest . stânga = nul ;
acest . dreapta = nul ;
}
} ;

unde displayLeafNodes = ( rootNode ) =>
{
dacă ( rootNode == nul )
întoarcere ;

dacă ( rootNode. stânga == nul && rootNode. dreapta == nul )
{
document. scrie ( rootNode. conţinut + ' ' ) ;
întoarcere ;
}

dacă ( rootNode. stânga != nul )
displayLeafNodes ( rootNode. stânga ) ;
dacă ( rootNode. dreapta != nul )
displayLeafNodes ( rootNode. dreapta ) ;
}
a fost sampleNode = ( val ) =>
{
a fost tempNode = nou Nodul ( ) ;
tempNode. conţinut = val ;
tempNode. stânga = nul ;
tempNode. dreapta = nul ;
întoarcere tempNode ;
}
a fost rootNode = provNode ( 3 ) ;
rootNode. stânga = provNode ( 6 ) ;
rootNode. dreapta = provNode ( 9 ) ;
rootNode. stânga . stânga = provNode ( 12 ) ;
rootNode. stânga . dreapta = provNode ( cincisprezece ) ;
rootNode. stânga . dreapta . dreapta = provNode ( 24 ) ;
rootNode. dreapta . stânga = provNode ( 18 ) ;
rootNode. dreapta . dreapta = provNode ( douăzeci și unu ) ;

displayLeafNodes ( rootNode ) ;

Explicația blocului de cod de mai sus este prezentată mai jos:



  • Mai întâi, creați o clasă numită „ nodul ”, care creează un nou nod și își setează valoarea la „ 0 ”. Anexa ' stânga ' și ' dreapta ” nodurile laterale sunt setate la ” nul ” în mod implicit folosind constructorul de clasă.
  • Apoi, definiți un „ displayLeafNodes() ” funcție care acceptă un singur parametru de “ rootNode ”. Această valoare parametrică este considerată ca nodul selectat curent al unui arbore binar.
  • În interiorul funcției, „ dacă Declarația ” este utilizată pentru a verifica dacă ” rootNode ” este nulă sau nu. În cazul în care ' nul ” execuția ulterioară s-a oprit pentru acel nod. În celălalt caz, rootNode „ stânga ' și ' dreapta ” nodurile laterale sunt verificate pentru “ nul ”. Dacă ambele sunt nule, valoarea acelui „ nodul ” este tipărit.
  • Dacă „ stânga ” sau ” dreapta ” nodul nu este „null”, apoi treceți acea parte a nodului la „ displayLeafNodes() ” pentru operația recursivă.
  • Definiți o nouă funcție numită „ provNode() „ care acceptă singurul parametru „ val ”. În interiorul funcției, creați o nouă instanță a „ Nodul ” clasa numită ” tempNode ”. Atribuiți parametrul „ val ” ca valoare pentru proprietatea clasei ” conţinut ” și setați „ stânga ' și ' dreapta „nodurile laterale către „ nul ' în mod implicit.
  • În cele din urmă, creați un obiect numit „ rootNode ' pentru ' provNode() ” și transmiteți valoarea nodului ca parametru al acestei funcție. Creați nodurile din stânga și din dreapta adăugând „ stânga ' și ' dreapta ” cuvinte cheie cu „rootNode” și atribuiți-le valoare folosind aceeași funcție „ provNode() ”.
  • stânga ” înseamnă poziția din stânga a nodului rădăcină și „ stânga.stânga ” poziția înseamnă stânga din stânga aceeași abordare este aplicată în cazul ” dreapta ' și ' dreapta
  • După definirea arborelui, treceți „rootNode” ca argument pentru „ displayLeadNodes() ” pentru a selecta și imprima toate nodurile frunze ale arborelui creat.

Rezultatul generat după compilare confirmă că nodul frunză al arborelui furnizat a fost preluat și tipărit pe consolă:

Metoda 2: Imprimați toate nodurile frunze ale unui arbore binar utilizând abordarea iterativă

iterativ abordarea este cea mai eficientă abordare, folosește conceptul de „ Apăsaţi ' și ' pop ” pentru a selecta „ frunze ” noduri. Punctele cheie sau funcționarea acestei abordări sunt prezentate mai jos:

clasă Nodul
{
constructor ( valoare )
{
acest . date = valoare ;
acest . stânga = nul ;
acest . dreapta = nul ;
}
} ;

unde displayLeafNodes = ( rootNode ) =>
{
dacă ( ! rootNode )
întoarcere ;
lasa lista = [ ] ;
listă. Apăsaţi ( rootNode ) ;

in timp ce ( listă. lungime > 0 ) {
rootNode = listă [ listă. lungime - 1 ] ;
listă. pop ( ) ;
dacă ( ! rootNode. stânga && ! rootNode. dreapta )
document. scrie ( rootNode. date + ' ' ) ;
dacă ( rootNode. dreapta )
listă. Apăsaţi ( rootNode. dreapta ) ;
dacă ( rootNode. stânga )
listă. Apăsaţi ( rootNode. stânga ) ;
}
}

a fost rootNode = nou Nodul ( 3 ) ;
rootNode. stânga = nou Nodul ( 6 ) ;
rootNode. dreapta = nou Nodul ( 9 ) ;
rootNode. stânga . stânga = nou Nodul ( 12 ) ;
rootNode. stânga . dreapta = nou Nodul ( cincisprezece ) ;
rootNode. stânga . dreapta . dreapta = nou Nodul ( 24 ) ;
rootNode. dreapta . stânga = nou Nodul ( 18 ) ;
rootNode. dreapta . dreapta = nou Nodul ( douăzeci și unu ) ;

displayLeafNodes ( rootNode ) ;

Explicația codului de mai sus este scrisă mai jos:

  • Mai întâi, creați un „ Nodul „clasa care primește un singur parametru” valoare ” care este setat ca valoare a nodului nou creat, iar părțile din stânga și din dreapta sunt setate la nul. La fel ca în exemplul de mai sus.
  • Apoi, creați o funcție „ displayLeafNodes() ” care acceptă un singur parametru de ” rootNode ”. Acest „rootNode” este considerat arbore binar și golul său este mai întâi verificat.
  • Dacă nodul nu este gol, atunci o listă goală numită „ listă ” este creat și „ rootNode ” parametrul este inserat în el utilizând „ Apăsaţi() ” metoda.
  • Apoi, „ in timp ce() ' este utilizat care se execută până la lungimea unui ' listă ”. În interiorul buclei, elementul care se află în partea de jos a unui copac sau „ listă ” este eliminat folosind „ pop() ” metoda.
  • Acum, existența „ stânga ' și ' dreapta ” laturile „rootNode” sunt bifate, iar dacă ambele părți nu există înseamnă că nu are un nod copil. Apoi, acest nod este afișat pe ecran și identificat ca un nod frunză.
  • Dacă există un nod pe partea stângă sau dreaptă înseamnă că are copii. Apoi aia ' stânga ' și ' dreapta ' nodul este împins în ' listă ” pentru operația ulterioară de găsire a nodului frunză.
  • În cele din urmă, creați un arbore binar personalizat trecând valorile nodurilor ca parametri pentru „ Nodul ” constructor de clasă. După creare, transmiteți arborele „rootNode” ca argument pentru „ displayLeafNodes() ”funcție.

Rezultatul generat după compilare arată că nodurile frunze ale arborelui furnizat sunt tipărite:

Sfat bonus: imprimarea nodurilor de frunze ale unui arbore binar de la dreapta la stânga

Pentru a prelua toate nodurile frunză care nu au noduri copil în „ dreapta ' la ' stânga ”, abordarea recursivă este cea mai recomandată datorită ușurinței sale. De exemplu, același arbore discutat în secțiunile de mai sus va fi folosit pentru a prelua nodul frunză, dar în „ dreapta „la „ stânga ”, după cum se arată mai jos:

clasă Nodul
{
constructor ( valoare )
{
acest . date = valoare ;
acest . stânga = nul ;
acest . dreapta = nul ;
}
} ;


funcția displayLeafNodes ( rădăcină )
{
dacă ( rădăcină == nul )
{
întoarcere ;
}

dacă ( rădăcină. stânga == nul && rădăcină. dreapta == nul )
{
document. scrie ( rădăcină. date + ' ' ) ;
întoarcere ;
}
dacă ( rădăcină. dreapta != nul )
{
displayLeafNodes ( rădăcină. dreapta ) ;
}
dacă ( rădăcină. stânga != nul )
{
displayLeafNodes ( rădăcină. stânga ) ;
}
}


a fost rootNode = nou Nodul ( 3 ) ;
rootNode. stânga = nou Nodul ( 6 ) ;
rootNode. dreapta = nou Nodul ( 9 ) ;
rootNode. stânga . stânga = nou Nodul ( 12 ) ;
rootNode. stânga . dreapta = nou Nodul ( cincisprezece ) ;
rootNode. stânga . dreapta . dreapta = nou Nodul ( 24 ) ;
rootNode. dreapta . stânga = nou Nodul ( 18 ) ;
rootNode. dreapta . dreapta = nou Nodul ( douăzeci și unu ) ;

displayLeafNodes ( rootNode ) ;

Codul de mai sus funcționează astfel:

  • În primul rând, clasa „ Nodul ” este creat care folosește constructorul implicit pentru a adăuga un nou nod în arbore doar linkul făcut în exemplele de mai sus.
  • În continuare, „ displayLeadNodes() este creată funcția care acceptă un singur parametru de „ rootNode ”. Acest parametru este verificat pentru „ nul „condiție prin intermediul „ dacă ' afirmație.
  • Dacă nodul furnizat nu este adevărat, atunci este „ stânga ' și ' dreapta ” nodurile laterale sunt verificate pentru “ nul ' condiție. Dacă ambele sunt nule, atunci nodul va fi identificat ca „ frunze ” și tipărite pe pagina web.
  • După aceea, treceți „ dreapta ' și ' stânga ” nodurile ” rootNode „la „ displayLeafNodes() ”funcție.
  • Alocați poziția fiecărui nod prin crearea instanțelor folosind „ nou cuvântul cheie și „ Nodul() ” constructor și specificând poziția ca parametru constructor.
  • stânga ” înseamnă poziția din stânga a nodului rădăcină și „ stânga.stânga ” poziția înseamnă stânga sau stânga. Aceeași abordare se aplică și în cazul „ dreapta ' și ' dreapta ”.
  • În cele din urmă, treceți „ rootNode ' ca argument pentru ' displayLeafNode() ”funcție.

Rezultatul generat arată că nodurile frunzelor sunt tipărite în direcția de la dreapta la stânga.

Este vorba despre imprimarea tuturor nodurilor frunze ale unui arbore binar în orice direcție dorită.

Concluzie

Pentru a imprima toate nodurile frunze ale unui arbore binar, creați o clasă aleatorie care creează și atribuie valori nodurilor arborelui. Apoi, creați o funcție aleatorie care acceptă un singur nod al arborelui într-o ierarhie de sus în jos. Această funcție conține mai multe „ dacă ” condiții care verifică dacă „ nodul ” nu este gol și nu are noduri în „ stânga ' și ' dreapta ”, atunci acel nod este considerat ca un „ frunze ” și este afișat pe consolă. Acest ghid a explicat procedura de tipărire a tuturor nodurilor frunze ale unui arbore binar de la stânga la dreapta sau de la dreapta la stânga.