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