Общее описание:
Используйте Поиск в ширину (BFS) в отличие от Поиск в глубину (DFS) . Найти первый узел без детей.
Используя DFS, вам может повезти на некоторых входных деревьях (но нет способа узнать, что вам повезло, поэтому вам все равно нужно искать по всему дереву), но использование метода BFS намного быстрее, и вы можете найти решение не касаясь всех узлов.
Чтобы найти путь от корня к листу, вы можете пройти по первому найденному бездетному узлу до самого корня, используя родительскую ссылку. Если у вас нет родительской ссылки, хранящейся в каждом узле, вы можете отслеживать родительские узлы по мере их восстановления. Если у вас есть список в обратном порядке, вы можете поместить его в стек, а затем вытолкнуть.
Псевдо-код:
Проблема очень проста; Вот псевдокод, чтобы найти наименьшую длину:
- Поместить корневой узел в очередь.
Повторите, пока очередь не пуста, и ничего не найдено:
- Вытащите узел из начала очереди и проверьте, нет ли у него дочерних элементов. Если у вас нет детей, вы
Готово, вы нашли кратчайший путь.
- В противном случае все дети (слева, справа) помещаются в очередь.
Поиск всех кратчайших путей:
Чтобы найти все кратчайшие пути, вы можете сохранить глубину узла вместе с узлом внутри очереди. Затем вы продолжите алгоритм для всех узлов в очереди с одинаковой глубиной.
Альтернатива:
Если вместо этого вы решили использовать DFS, вам придется искать по всему дереву, чтобы найти кратчайший путь. Но это можно оптимизировать, сохранив значение для самого короткого до сих пор и проверяя только глубину будущих узлов до тех пор, пока вы не найдете новый самый короткий, или пока вы не достигнете самого короткого до сих пор. BFS - намного лучшее решение.