Решение грубой силы - это поиск в ширину, заканчивающийся на первом найденном листе, это будет легче реализовать итеративно, чем рекурсивно.
См., Например, псевдокод в мой ответ на«Breadth First против Depth First» просто добавьте еще одно условие в цикл while.
BTW - это даст вам a лист с минимальной глубиной, так как может бытьбольше, чем один на этой глубине.Получить полный набор листьев минимальной глубины немного сложнее.Я думаю, что пойти с итеративной стратегии углубления .
Выяснить, какой уровень этот узел один.
Три варианта:
Найтисначала узел и поиск по дереву для него.Это звучит расточительно, но второй поиск требует посещения только такого количества узлов, как уровень, поэтому он действительно быстрый.
С другой стороны, вы можете следить за ходом.Вы используете три счетчика levelCounter
, thisLevelCounter
и nextLevelCounter
.Каждый раз, когда вы переходите на новый узел, вы уменьшаете thisLevelCounter
, а когда он достигает нуля, вы перемещаетесь вниз на уровень, поэтому
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Каждый раз, когда вы добавляете дочерний узел в список поиска, увеличиваетсяnextLevelCounter
.Каждый раз, когда вы сохраняете новый прирост дочернего узла nextLevelCounter
Наконец, стратегия итеративного углубления дает вам уровень успеха бесплатно (какая итерация находит его ...) и имеет тот же порядок производительности (хотя инемного выше множитель) в качестве ширины первого поиска.