Вы можете преобразовать эту рекурсивную функцию в итерационную функцию с помощью стека.
//breadth first traversal pseudo-code
push root to a stack
while( stack isn't empty )
pop element off stack
push children
perform action on current node
В зависимости от того, как вы хотите пройти узлы, реализация будет отличаться. Все рекурсивные функции могут быть преобразованы в итеративные. Общее использование того, как требуется информация о конкретной проблеме. Использование стеков / очередей и преобразование в цикл for являются распространенными методами, которые должны решать большинство ситуаций.
Вам также следует изучить хвостовую рекурсию и определить, как ее идентифицировать, поскольку эти проблемы прекрасно преобразуются в цикл for, многие компиляторы даже делают это для вас.
Некоторые, более математически ориентированные рекурсивные вызовы могут быть решены с помощью рекуррентных отношений . Вероятность того, что вы столкнетесь с теми, которые еще не решены, маловероятна, но может вас заинтересовать.
// редактировать, производительность?
На самом деле зависит от вашей реализации и размера дерева. Если в вашем рекурсивном вызове много глубины, вы получите переполнение стека, в то время как итеративная версия будет работать нормально. Я лучше разбираюсь в рекурсии (как используется память), и вы сможете решить, что лучше для вашей ситуации. Вот пример такого типа анализа с числами Фибоначчи .