Визуалното представяне на обсъжданите концепции е показано на фигурата по-долу:
Това ръководство обяснява процеса на отпечатване на всички листови възли на двоично дърво, като покрива посочените по-долу секции:
- Как да идентифицираме листните възли?
- Как да отпечатате всички листови възли на двоично дърво отляво надясно в 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() ” функция.
Генерираният изход показва, че листовите възли се отпечатват в посока отдясно наляво.
Това е всичко за отпечатване на всички листови възли на двоично дърво във всяка желана посока.
Заключение
За да отпечатате всички листови възли на двоично дърво, създайте произволен клас, който създава и присвоява стойности на възлите на дървото. След това създайте произволна функция, която приема единичен възел на дървото в йерархия отгоре надолу. Тази функция съдържа множество „ ако “ условия, които проверяват дали „ възел ” не е празен и няма възли в „ наляво ' и ' точно ”, тогава този възел се счита за „ листо ” и се показва на конзолата. Това ръководство обяснява процедурата за отпечатване на всички листови възли на двоично дърво отляво надясно или отдясно наляво.