Javascript-dagi kenglik-birinchi va chuqurlikdagi birinchi daraxt traversal

Agar daraxtda biron bir tugun mavjudligini bilish uchun uni qidirsak, ikkita algoritmni qurishimiz mumkin. Biz daraxtning kengligini yoki chuqurligini birinchi tomondan ko'rib chiqamiz.

Chuqurlikning birinchi usuli daraxtning o'lik oxirigacha iloji boricha pastga tushishiga ishonadi. U nol qiymatga tegsa, yuqoridan zaxiralashni boshlaydi va xuddi shu jarayonni bajaradi.

Kenglikdagi birinchi usul iloji boricha yuqori qismga yaqin turishga harakat qiladi. U daraxtni bir qatordan birma-bir kesib o'tadi va barcha uka tugunlariga qaraydi. Bu oxirgi qatorga yetguncha davom etadi.

Oddiy tugun va daraxtlar sinfini qurish

Node sinfida ikkita xususiyatga ega bo'lgan konstruktor bo'ladi. U tugun qiymatini saqlash uchun ma'lumotlar xususiyatiga va bolalar tugunlari qatorini saqlash uchun bolalar xususiyatiga ega bo'ladi. Add () usuli daraxtga yangi tugunlarni qo'shish uchun ishlatilishi mumkin va olib tashlash () usuli istalmagan bola tugunini yo'q qiladi.

Daraxt sinfini yaratishda bizga faqat ildiz deb nomlanuvchi birinchi tugunni ko'rsatadigan xususiyat kerak.

Daraxt sinfining ichida biz tugunlar daraxti orqali qidirish uchun DFS va BFS izlash funktsiyalarimizni yaratamiz.

Chuqurlik - birinchi algoritm

DFS yondashuvidan foydalanib, daraxtda ma'lum bir qiymat borligini tekshirish uchun biz ildiz tugunini o'z ichiga olgan to'plamlar qatorini e'lon qilish bilan boshlanadigan funktsiyani yaratamiz. Keyinchalik, massivning ichida endi qiymat bo'lmaguncha, biz bir oz vaqtni olamiz.

DFS tugunlar daraxtini kesib o'tish uchun stackdan foydalanadi. Massivning birinchi qiymatini o'chirib, biz joriy tugunni e'lon qilamiz. Ushbu tugun yordamida biz uning ma'lumotlari biz izlayotgan qiymatga teng yoki yo'qligini tekshiramiz. Agar u teng bo'lsa, biz True ni qaytaramiz va funktsiyadan chiqib ketamiz. Agar tugunning qiymati mos kelmasa, biz ular mavjud bo'lsa, biz tugunning bolalarini massivning old tomoniga suramiz. Biz bolalarni old tomon siljitamiz, chunki DFS yondoshuvi har qanday aka-uka a'zolarini tekshirishdan oldin daraxtning tagiga borishni xohlaydi. Agar butun daraxtni qidirgandan so'ng biron bir qiymatga mos kelmasa, biz vazifamiz oxirida noto'g'ri qiymatni qaytaramiz.

Nonning birinchi algoritmi

DFS funktsiyasini qurgandan so'ng, BFS funktsiyasi juda o'xshash ko'rinadi, ammo bitta kichik farq bilan. BFS yondashuvidan foydalanganda, daraxtning keyingi qatoriga o'tishdan oldin, barcha aka-uka elementlarni tekshirishni xohlaymiz. Biz buni Queue yordamida amalga oshiramiz. Navbat bizdan tugunning bolalariga ishlov berishda unshift usuli o'rniga surish usulidan foydalanishimizni talab qiladi. Tugunning bolalarini olib, ularni to'plamlar qatoriga qo'yishning o'rniga, biz ularni oxirigacha itaramiz. Bu daraxtning keyingi qatoriga o'tishdan oldin, barcha aka-uka elementlarini tekshirishimizga ishonch hosil qiladi.

BFS va DFS-dan qachon foydalanish kerak?

Ikkala algoritm ham qiymat izlash uchun daraxtdan o'tayotganda foydali bo'lishi mumkin, ammo qaysi biri yaxshiroq? Bularning barchasi daraxtning tuzilishiga va siz izlayotgan narsaga bog'liq. Agar siz qidirayotgan qiymatingiz yuqoriga yaqinroq ekanligini bilsangiz, BFS yondoshuvi afzalroq tanlov bo'lishi mumkin, ammo agar daraxt juda keng va juda chuqur bo'lmasa, DFS yondoshuvi tezroq va samaraliroq bo'lishi mumkin. Shuni yodda tutingki, qaysi yondashuvni tanlashdan oldin aniqlash kerak bo'lgan boshqa ko'plab omillar mavjud. Ishonamanki, siz buni tushunasiz!