Breadth-first vs Depth-first Tree Traversal ໃນ Javascript

ໃນເວລາທີ່ພວກເຮົາຄົ້ນຫາໂດຍຜ່ານຕົ້ນໄມ້ເພື່ອຊອກຫາວ່າມັນມີ node ທີ່ແນ່ນອນ, ມີສອງສູດການຄິດໄລ່ທີ່ພວກເຮົາສາມາດສ້າງ. ພວກເຮົາສາມາດຂ້າມຕົ້ນໄມ້ດ້ວຍວິທີທີ່ກວ້າງ - ທຳ ອິດຫລືເລິກເຊິ່ງ.

ວິທີການເລິກທີ່ສຸດເຊື່ອໃນການລົງຕົ້ນໄມ້ໃຫ້ຫຼາຍເທົ່າທີ່ຈະຫຼາຍໄດ້ຈົນກວ່າມັນຈະຮອດຈຸດຈົບຂອງຄວາມຕາຍ. ເມື່ອມັນຕີມູນຄ່າທີ່ບໍ່ໄດ້ຮັບ, ມັນເລີ່ມຕົ້ນກັບຄືນໄປບ່ອນຢູ່ເທິງສຸດແລະປະຕິບັດຕາມຂະບວນການດຽວກັນ.

ວິທີການກວ້າງປະມານ ທຳ ອິດພະຍາຍາມສຸດຄວາມສາມາດທີ່ຈະຢູ່ໃກ້ສຸດເທົ່າທີ່ເປັນໄປໄດ້. ມັນຂ້າມຕົ້ນໄມ້ຕິດຕໍ່ກັນເປັນແຖວໃນເວລາດຽວກັນແລະເບິ່ງທັງ ໝົດ ຂອງຂໍ້ອ້າຍເອື້ອຍນ້ອງຂອງມັນ. ມັນຍັງສືບຕໍ່ນີ້ຈົນກວ່າມັນຈະຮອດແຖວສຸດທ້າຍ.

ການກໍ່ສ້າງຫ້ອງຮຽນ Node ແລະ Tree ງ່າຍໆ

ຫ້ອງຮຽນ Node ຈະມີຜູ້ສ້າງທີ່ມີຄຸນສົມບັດສອງຢ່າງ. ມັນຈະມີຄຸນສົມບັດຂໍ້ມູນເພື່ອເກັບມູນຄ່າຂອງຂໍ້ແລະຊັບສິນຂອງເດັກເພື່ອຖືເອົາຂໍ້ມູນຂອງເດັກນ້ອຍ. ວິທີການຕື່ມ () ສາມາດຖືກ ນຳ ໃຊ້ເພື່ອເພີ່ມຂໍ້ ໃໝ່ ໃນຕົ້ນໄມ້ແລະວິທີການລົບ () ຈະລົບຂໍ້ ກຳ ນົດເດັກທີ່ບໍ່ຕ້ອງການ.

ເມື່ອສ້າງ Class Class, ພວກເຮົາພຽງແຕ່ຕ້ອງການຊັບສິນເພື່ອຊີ້ໄປທີ່ຂໍ້ ທຳ ອິດ, ເຊິ່ງເອີ້ນວ່າຮາກ.

ພາຍໃນຊັ້ນ Tree ແມ່ນບ່ອນທີ່ພວກເຮົາສ້າງ ໜ້າ ທີ່ຄົ້ນຫາ DFS ແລະ BFS ເພື່ອຄົ້ນຫາຜ່ານ Tree of nodes.

ສູດການຄິດໄລ່ເລິກ-First

ເພື່ອກວດສອບເບິ່ງຕົ້ນໄມ້ມີຄຸນຄ່າແນ່ນອນໂດຍໃຊ້ວິທີການຂອງ DFS, ພວກເຮົາຈະສ້າງ ໜ້າ ທີ່ທີ່ເລີ່ມຕົ້ນໂດຍການປະກາດຕາຕະລາງການເກັບລວບລວມເຊິ່ງຈະປະກອບມີ node ຮາກ. ຈາກນັ້ນພວກເຮົາຈະສ້າງ loop ໃນຂະນະທີ່ຈະ ດຳ ເນີນການຈົນກວ່າຈະບໍ່ມີຄ່າພາຍໃນອາເລອີກຕໍ່ໄປ.

DFS ໃຊ້ Stack ເພື່ອຂ້າມຕົ້ນໄມ້ຂອງຂໍ້. ພວກເຮົາຈະປະກາດ node ປະຈຸບັນໂດຍການປ່ຽນຄ່າຂອງອາເລ ທຳ ອິດ. ດ້ວຍຂໍ້ນີ້, ພວກເຮົາຈະກວດເບິ່ງວ່າຂໍ້ມູນຂອງມັນເທົ່າກັບມູນຄ່າທີ່ພວກເຮົາ ກຳ ລັງຄົ້ນຫາຢູ່. ຖ້າມັນເທົ່າກັນ, ພວກເຮົາຈະກັບຄືນ True ແລະອອກຈາກ ໜ້າ ທີ່. ຖ້າຄ່າຂອງຂໍ້ມູນບໍ່ກົງກັນ, ພວກເຮົາຈະຊຸກດັນໃຫ້ເດັກນ້ອຍຂອງຂໍ້ນັ້ນຢູ່ທາງ ໜ້າ ຂອງແຖວຖ້າມັນມີຢູ່. ພວກເຮົາຍົກຍ້າຍເດັກນ້ອຍໄປທາງ ໜ້າ ເພາະວ່າວິທີການຂອງ DFS ຕ້ອງການໃຫ້ພວກເຮົາເດີນທາງໄປທາງລຸ່ມຂອງຕົ້ນໄມ້ກ່ອນທີ່ຈະກວດເບິ່ງອົງປະກອບຂອງອ້າຍເອື້ອຍນ້ອງທຸກໆຄົນ. ຖ້າບໍ່ມີຄຸນຄ່າຫຍັງທຽບໃສ່ຫຼັງຈາກຄົ້ນຫາຕົ້ນໄມ້ທັງ ໝົດ, ພວກເຮົາກໍ່ສົ່ງຄືນທີ່ບໍ່ຖືກຕ້ອງໃນຕອນທ້າຍຂອງ ໜ້າ ທີ່ຂອງພວກເຮົາ.

Algorithm-First Algorithm

ຫລັງຈາກສ້າງ DFS ແລ້ວ, ຟັງຊັນ BFS ຈະມີລັກສະນະຄ້າຍຄືກັນ, ແຕ່ມີຄວາມແຕກຕ່າງ ໜ້ອຍ ໜຶ່ງ. ເມື່ອພວກເຮົາໃຊ້ວິທີການ BFS, ພວກເຮົາຕ້ອງການກວດສອບທຸກໆອົງປະກອບຂອງອ້າຍເອື້ອຍນ້ອງກ່ອນທີ່ຈະໄປແຖວຕົ້ນໄມ້ຕໍ່ໄປ. ພວກເຮົາຈະເຮັດ ສຳ ເລັດສິ່ງນີ້ໂດຍການໃຊ້ຄິວ. Queue ຮຽກຮ້ອງໃຫ້ພວກເຮົາໃຊ້ວິທີການຍູ້ແທນທີ່ຈະເປັນວິທີການທີ່ບໍ່ສະດວກໃນເວລາຈັດການກັບເດັກນ້ອຍຂອງຂໍ້. ແທນທີ່ຈະເອົາເດັກນ້ອຍຂອງ node ແລະຕັ້ງພວກເຂົາຢູ່ທາງຫນ້າຂອງແຖວເກັບກໍາຂໍ້ມູນ, ພວກເຮົາແທນທີ່ຈະຍູ້ພວກເຂົາຈົນເຖິງທີ່ສຸດ. ນີ້ເຮັດໃຫ້ແນ່ໃຈວ່າພວກເຮົາຈະກວດເບິ່ງອົງປະກອບຂອງອ້າຍເອື້ອຍນ້ອງທັງ ໝົດ ກ່ອນທີ່ຈະໄປແຖວຕົ້ນໄມ້ຕໍ່ໄປ.

ເວລາທີ່ຈະໃຊ້ BFS ທຽບກັບ DFS?

ສູດການຄິດໄລ່ທັງສອງສາມາດໃຊ້ໄດ້ງ່າຍໃນເວລາທີ່ຜ່ານຕົ້ນໄມ້ເພື່ອຊອກຫາຄ່າ, ແຕ່ວ່າອັນໃດດີກວ່າ? ມັນທັງ ໝົດ ແມ່ນຂື້ນກັບໂຄງສ້າງຂອງຕົ້ນໄມ້ແລະສິ່ງທີ່ທ່ານ ກຳ ລັງຊອກຫາ. ຖ້າທ່ານຮູ້ວ່າຄຸນຄ່າທີ່ທ່ານ ກຳ ລັງຊອກຫາຢູ່ໃກ້ກັບຈຸດສູງສຸດ, ວິທີການຂອງ BFS ອາດຈະເປັນທາງເລືອກທີ່ດີກວ່າ, ແຕ່ຖ້າຕົ້ນໄມ້ກວ້າງແລະບໍ່ເລິກ, ວິທີການ DFS ອາດຈະໄວແລະມີປະສິດທິພາບຫຼາຍ. ພຽງແຕ່ຈື່ວ່າມີປັດໃຈອື່ນໆອີກຫຼາຍຢ່າງທີ່ທ່ານຈະຕ້ອງ ກຳ ນົດກ່ອນທີ່ຈະເລືອກເອົາວິທີການໃດທີ່ຈະປະຕິບັດ. ຂ້າພະເຈົ້າມີຄວາມເຊື່ອ ໝັ້ນ ວ່າທ່ານຈະຄິດອອກ!