1) найти лист, ближайший к корню дерева (DFS)
2) найти глубину данного узла, если вы не знаете, это уже (ДФС)
3) найдите ближайший к данному узлу лист среди его потомков (DFS)
Решение является самым коротким среди 1 + 2 и 3. Оно, вероятно, может быть объединено в одну DFS.
Как указано @Eyal, это неправильно.
Вот исправление:
1) Для каждого узла в дереве, найти ближайший лист среди его потомков (DFS).
2) Для каждого узла по пути от корня дерева до данного узла добавьте расстояние от узла до его ближайшего потомка и расстояние до данного узла.
Решение дается наименьшей суммой.
Вы можете реализовать это следующим образом:
Start из алгоритма DFS, который находит ближайший потомок лист для всех узлов в дереве.
Измените рекурсивную функцию так, чтобы она знала: а) глубину текущего узла, пусть Dc, b) глубина данного узла, пусть Dg и c) наименьшая глубина, достигнутая с того момента, как данный узел был замечен , пусть Ds, первоначально установленный в -1, d) ближайший узел до сих пор (не обязательно потомок).
Перед тем, как оставить функцию, если текущий узел является данным узлом, установите Dg = Ds = Dc; else, если Dc < Ds, обновите Ds = Dc и сохраните ближайший узел между ближайшим до сих пор и ближайшим потомком текущего узла, добавив штраф Dc-Dg на расстояние.
Вы пробовали что-нибудь? – Balduz
, пожалуйста, прочитайте вопрос, о котором я упомянул, что я пробовал, и где я столкнулся с проблемой. Благодарю. – JasonBlacket
Отправьте код, который вы пробовали – Balduz