Першая шырата супраць першага паглыблення дрэва ў Javascript

Калі мы шукаем дрэва, каб знайсці, ці змяшчае ён пэўны вузел, мы можам пабудаваць два алгарытмы. Мы можам перасекчы дрэва з падыходам у шырыню ці на глыбіню.

Першы метад глыбіні верыць у тое, каб ісці як мага далей па дрэве, пакуль не дасягнуць тупіка. Пасля таго, як ён атрымлівае нулявае значэнне, ён пачынае ствараць рэзервовую копію ў верхняй частцы і выконвае той самы працэс.

Першы спосаб ушыркі імкнецца трымацца як мага бліжэй да вяршыні. Ён перамяшчае дрэва па адным радку і разглядае ўсе яго сястры. Гэта працягваецца, пакуль не дойдзе да апошняга шэрагу.

Пабудова простага класа Node and Tree

Клас Node будзе мець канструктар з двума ўласцівасцямі. Ён будзе мець уласцівасць дадзеных для захоўвання значэння вузла і дзіцячай уласцівасці для ўтрымання масіва даччыных вузлоў. Метад add () можа быць выкарыстаны для дадання новых вузлоў да Дрэва, а метод delete () выдаліць непатрэбны даччыны вузел.

Пры пабудове класа Tree нам патрэбна толькі ўласцівасць паказваць на першы вузел, таксама вядомы як корань.

Унутры класа дрэва мы будуем нашы функцыі пошуку DFS і BFS для пошуку па Дрэве вузлоў.

Глыбіня-першы алгарытм

Каб праверыць, ці ўтрымлівае дрэва пэўнае значэнне з выкарыстаннем падыходу DFS, мы створым функцыю, якая пачынаецца з абвяшчэння масіва калекцый, які будзе ўтрымліваць каранёвы вузел. Затым мы пабудуем цыкл некаторы час, які будзе працаваць, пакуль у масіве не перастане значэнне.

DFS выкарыстоўвае Стэк для прасоўвання па дрэве вузлоў. Мы аб'явім бягучы вузел, зрушваючы першае значэнне масіва. З дапамогай гэтага вузла мы правяраем, ці адпавядаюць яго дадзеным значэнні, якія мы шукаем. Калі яго роўнасць, мы вернем True і выйдзем з функцыі. Калі значэнне вузла не супадае, мы адштурхнем дзяцей гэтага вузла на пярэднюю частку масіва, калі яны ёсць. Мы адхіляем дзяцей на пярэднюю частку, таму што падыход DFS хоча, каб мы прайшлі да самага дна дрэва, перш чым праверыць любы элемент. Калі пасля пошуку цэлага дрэва ні адно значэнне не супадае, мы вернем ілжывае ў канцы нашай функцыі.

Шырыня-першы алгарытм

Пасля пабудовы функцыі DFS функцыя BFS будзе выглядаць вельмі падобна, але з адной невялікай розніцай. Калі мы выкарыстоўваем падыход BFS, мы хочам праверыць усе элементы родных братоў, перш чым перайсці да наступнага шэрагу дрэва. Мы даможамся гэтага, выкарыстоўваючы чаргу. Чарга патрабуе, каб мы выкарыстоўвалі метад націску замест спосабу хуткага зруху пры звароце з дзецьмі вузла. Замест таго, каб узяць дзяцей з вузла і ўсталяваць іх у пярэднюю частку масіва калекцый, мы замест гэтага падштурхнем іх да канца. Гэта гарантуе, што мы будзем правяраць усе элементы родных братоў, перш чым перайсці да наступнага шэрагу дрэва.

Калі выкарыстоўваць BFS супраць DFS?

Абодва алгарытмы могуць спатрэбіцца пры праходжанні дрэва і шукае значэнне, але які лепш? Усё залежыць ад структуры дрэва і таго, што вы шукаеце. Калі вы ведаеце, што каштоўнасць, якую вы шукаеце, бліжэй да вяршыні, падыход BFS можа стаць выдатным выбарам, але калі дрэва вельмі шырокае і не занадта глыбокае, падыход DFS можа быць больш хуткім і эфектыўным. Толькі ўлічыце, што ёсць шмат іншых фактараў, якія вам трэба будзе вызначыць, перш чым выбраць, які падыход трэба прыняць. Упэўнена, вы гэта зразумееце!