Как да отпечатате всички листови възли на двоично дърво отляво надясно в JavaScript?

Kak Da Otpecatate Vsicki Listovi V Zli Na Dvoicno D Rvo Otlavo Nadasno V Javascript



Двоичното дърво се състои от множество възли, които са свързани чрез върхове, като всеки възел може да бъде свързан с най-много два дъщерни възела, които са известни като неговите дъщерни възли. Ако „ възел ” няма родителски възел, но съдържа някои дъщерни възли, които имат възли-внуци, тогава той е известен като „ корен ” възел. Възелът е „ атрешна ” възел, ако има родителския възел и дъщерния възел. „ листо ” възелът има родителски възел, но без дъщерен възел означава възлите, които са задънената улица.

Визуалното представяне на обсъжданите концепции е показано на фигурата по-долу:







Това ръководство обяснява процеса на отпечатване на всички листови възли на двоично дърво, като покрива посочените по-долу секции:



Как да идентифицираме листните възли?

листо ” възлите са тези, които нямат дъщерни възли, или за да бъдем конкретни, които имат „ височина ' на ' 0 ”. Ако възелът има „ височина ' по-велик от ' 0 ”, тогава този възел може да бъде вътрешен възел или основен възел. „ листо ” възлите обикновено се проследяват назад, за да се идентифицира оригиналният източник, откъдето е генериран този възел. Използва се най-вече в алгоритми за търсене или откриване на грешки, за да се намери причината за грешка или проблем.



Как да отпечатате всички листови възли на двоично дърво отляво надясно в JavaScript?

Има два подхода' рекурсивен ' и ' итеративен ”, за да изберете всички листови възли, налични в предоставеното двоично дърво в желания „ наляво ' да се ' точно ' посока. Практическото прилагане на тези подходи е демонстрирано в посочените по-долу раздели:





Метод 1: Отпечатайте всички листови възли на двоично дърво отляво надясно рекурсивно

Рекурсивният подход избира всички възли в a алгоритъм за първо търсене в дълбочина начин, който първо пресича целите леви странични възли, след това средния възел и накрая десните странични възли. Тази операция се извършва рекурсивно за всеки възел и когато няма по-нататъшно преминаване през „ листо ” възлите се идентифицират. За да разберете по-добре тази концепция, посетете кодовия фрагмент по-долу:

клас Възел
{
конструктор ( )
{
това . съдържание = 0 ;
това . наляво = нула ;
това . точно = нула ;
}
} ;

където displayLeafNodes = ( rootNode ) =>
{
ако ( rootNode == нула )
връщане ;

ако ( rootNode. наляво == нула && rootNode. точно == нула )
{
документ. пишете ( rootNode. съдържание + ' ' ) ;
връщане ;
}

ако ( rootNode. наляво != нула )
displayLeafNodes ( rootNode. наляво ) ;
ако ( rootNode. точно != нула )
displayLeafNodes ( rootNode. точно ) ;
}
беше sampleNode = ( вал ) =>
{
беше tempNode = нов Възел ( ) ;
tempNode. съдържание = вал ;
tempNode. наляво = нула ;
tempNode. точно = нула ;
връщане tempNode ;
}
беше rootNode = provNode ( 3 ) ;
rootNode. наляво = provNode ( 6 ) ;
rootNode. точно = provNode ( 9 ) ;
rootNode. наляво . наляво = provNode ( 12 ) ;
rootNode. наляво . точно = provNode ( петнадесет ) ;
rootNode. наляво . точно . точно = provNode ( 24 ) ;
rootNode. точно . наляво = provNode ( 18 ) ;
rootNode. точно . точно = provNode ( двадесет и едно ) ;

displayLeafNodes ( rootNode ) ;

Обяснението на горния кодов блок е посочено по-долу:



  • Първо създайте клас с име „ възел “, който създава нов възел и задава стойността му на „ 0 ”. Приложеното „ наляво ' и ' точно ” страничните възли са зададени на „ нула ” по подразбиране с помощта на конструктора на класа.
  • След това дефинирайте „ displayLeafNodes() ' функция, която приема един параметър на ' rootNode ”. Тази параметрична стойност се счита за текущо избран възел на двоично дърво.
  • Вътре във функцията „ ако ' се използва за проверка дали ' rootNode ” е нула или не. В случай че ' нула ” по-нататъшното изпълнение спря за този възел. В другия случай rootNode “ наляво ' и ' точно ” страничните възли се проверяват за „ нула ”. Ако и двете са нулеви, стойността на това „ възел ” се отпечатва.
  • Ако „ наляво ' или ' точно ” възелът не е „нулев”, тогава прехвърлете тази страна на възела към „ displayLeafNodes() ” за рекурсивната операция.
  • Дефинирайте нова функция с име „ provNode() ”, който приема единствения параметър на „ вал ”. Вътре във функцията създайте нов екземпляр на „ Възел ' клас с име ' tempNode ”. Задайте параметричния „ вал ' като стойност за свойството на класа ' съдържание ” и задайте „ наляво ' и ' точно ' странични възли към ' нула ' по подразбиране.
  • Накрая създайте обект с име ' rootNode ' за ' provNode() ” и предайте стойността на възела като параметър на тази функция. Създайте левия и десния страничен възел, като добавите „ наляво ' и ' точно ' ключови думи с 'rootNode' и им присвоете стойност, като използвате същата функция ' provNode() ”.
  • наляво ” означава лявата позиция на основния възел и „ наляво.наляво ” позиция означава отляво отляво, същият подход се прилага в случая на „ точно ' и ' точно
  • След като дефинирате дървото, подайте „rootNode“ като аргумент за „ displayLeadNodes() ”, за да изберете и отпечатате всички листови възли на създаденото дърво.

Резултатът, генериран след компилацията, потвърждава, че листовият възел на предоставеното дърво е бил извлечен и отпечатан върху конзолата:

Метод 2: Отпечатайте всички листови възли на двоично дърво с помощта на итеративния подход

итеративен “ е най-ефективният подход, той използва концепцията за “ тласък ' и ' поп ”, за да изберете „ листо ” възли. Ключовите точки или работата на този подход са посочени по-долу:

клас Възел
{
конструктор ( стойност )
{
това . данни = стойност ;
това . наляво = нула ;
това . точно = нула ;
}
} ;

където displayLeafNodes = ( rootNode ) =>
{
ако ( ! rootNode )
връщане ;
нека списък = [ ] ;
списък. тласък ( rootNode ) ;

докато ( списък. дължина > 0 ) {
rootNode = списък [ списък. дължина - 1 ] ;
списък. поп ( ) ;
ако ( ! rootNode. наляво && ! rootNode. точно )
документ. пишете ( rootNode. данни + ' ' ) ;
ако ( rootNode. точно )
списък. тласък ( rootNode. точно ) ;
ако ( rootNode. наляво )
списък. тласък ( rootNode. наляво ) ;
}
}

беше rootNode = нов Възел ( 3 ) ;
rootNode. наляво = нов Възел ( 6 ) ;
rootNode. точно = нов Възел ( 9 ) ;
rootNode. наляво . наляво = нов Възел ( 12 ) ;
rootNode. наляво . точно = нов Възел ( петнадесет ) ;
rootNode. наляво . точно . точно = нов Възел ( 24 ) ;
rootNode. точно . наляво = нов Възел ( 18 ) ;
rootNode. точно . точно = нов Възел ( двадесет и едно ) ;

displayLeafNodes ( rootNode ) ;

Обяснението на горния код е написано по-долу:

  • Първо създайте „ Възел ' клас, който получава един параметър ' стойност ”, която е зададена като стойност на новосъздадения възел, а лявата и дясната страна са зададени на нула. Точно както е направено в горния пример.
  • След това създайте функция ' displayLeafNodes() ”, който приема един параметър от „ rootNode ”. Този „rootNode“ се счита за двоично дърво и първо се проверява неговата празнота.
  • Ако възелът не е празен, тогава празен списък с име „ списък ” се създава и „ rootNode ” се вмъква в него с помощта на „ натиснете () ” метод.
  • Тогава ' докато() ” се използва, който се изпълнява до дължината на „ списък ”. Вътре в цикъла, елементът, намиращ се в долната част на дърво или „ списък ” се премахва с помощта на „ поп () ” метод.
  • Сега съществуването на „ наляво ' и ' точно ” страни на „rootNode” се проверява и ако и двете страни не съществуват, това означава, че няма дъщерен възел. След това този възел се показва на екрана и се идентифицира като листов възел.
  • Ако има възел от лявата или дясната страна, това означава, че има деца. Тогава това ' наляво ' и ' точно ” възел се натиска в „ списък ” за по-нататъшна операция за намиране на листовия възел.
  • В крайна сметка създайте персонализирано двоично дърво, като предадете стойностите на възлите като параметри за „ Възел ” конструктор на клас. След създаването, подайте дървото „rootNode“ като аргумент за „ displayLeafNodes() ” функция.

Резултатът, генериран след компилацията, показва, че листовите възли на предоставеното дърво са отпечатани:

Бонус съвет: Отпечатване на листови възли на двоично дърво от дясно на ляво

За да извлечете всички листови възли, които нямат дъщерни възли в „ точно ' да се ' наляво ” рекурсивният подход е най-препоръчителен поради своята лекота. Например, същото дърво, обсъдено в горните раздели, ще се използва за извличане на листовия възел, но в „ точно ' към ' наляво ”, както е показано по-долу:

клас Възел
{
конструктор ( стойност )
{
това . данни = стойност ;
това . наляво = нула ;
това . точно = нула ;
}
} ;


функция displayLeafNodes ( корен )
{
ако ( корен == нула )
{
връщане ;
}

ако ( корен. наляво == нула && корен. точно == нула )
{
документ. пишете ( корен. данни + ' ' ) ;
връщане ;
}
ако ( корен. точно != нула )
{
displayLeafNodes ( корен. точно ) ;
}
ако ( корен. наляво != нула )
{
displayLeafNodes ( корен. наляво ) ;
}
}


беше rootNode = нов Възел ( 3 ) ;
rootNode. наляво = нов Възел ( 6 ) ;
rootNode. точно = нов Възел ( 9 ) ;
rootNode. наляво . наляво = нов Възел ( 12 ) ;
rootNode. наляво . точно = нов Възел ( петнадесет ) ;
rootNode. наляво . точно . точно = нов Възел ( 24 ) ;
rootNode. точно . наляво = нов Възел ( 18 ) ;
rootNode. точно . точно = нов Възел ( двадесет и едно ) ;

displayLeafNodes ( rootNode ) ;

Горепосоченият код работи по следния начин:

  • Първо, класът „ Възел ” се създава, който използва конструктора по подразбиране, за да добави нов възел в дървото само връзката, направена в горните примери.
  • След това „ displayLeadNodes() ” е създадена функция, която приема един параметър от „ rootNode ”. Този параметър се проверява за „ нула ” условие чрез „ ако ” изявление.
  • Ако предоставеният възел не е верен, тогава неговият „ наляво ' и ' точно ” страничните възли се проверяват за „ нула ” състояние. Ако и двете са нулеви, тогава възелът ще бъде идентифициран като „ листо ” и се отпечатва върху уеб страницата.
  • След това преминете „ точно ' и ' наляво ” възли на „ rootNode ' към ' displayLeafNodes() ” функция.
  • Разпределете позицията на всеки възел, като създадете екземплярите с помощта на „ нов “ ключова дума и „ възел () ” конструктор и указване на позицията като параметър на конструктора.
  • наляво ” означава лявата позиция на основния възел и „ наляво.наляво ” позиция означава ляво или ляво. Същият подход се прилага в случай на „ точно ' и ' точно ”.
  • Накрая преминете „ rootNode “ като аргумент за „ displayLeafNode() ” функция.

Генерираният изход показва, че листовите възли се отпечатват в посока отдясно наляво.

Това е всичко за отпечатване на всички листови възли на двоично дърво във всяка желана посока.

Заключение

За да отпечатате всички листови възли на двоично дърво, създайте произволен клас, който създава и присвоява стойности на възлите на дървото. След това създайте произволна функция, която приема единичен възел на дървото в йерархия отгоре надолу. Тази функция съдържа множество „ ако “ условия, които проверяват дали „ възел ” не е празен и няма възли в „ наляво ' и ' точно ”, тогава този възел се счита за „ листо ” и се показва на конзолата. Това ръководство обяснява процедурата за отпечатване на всички листови възли на двоично дърво отляво надясно или отдясно наляво.