При написании итератора необходимо что-то прояснить - итератор для структуры данных обеспечивает доступ к коллекции в виде линейной последовательности элементов. Некоторые коллекции, такие как массивы, списки и очереди, естественно совместимы с обработкой как линейная последовательность. Другие типы коллекций - деревья, словари, графики - не обязательно имеют простую интерпретацию как линейный список. На самом деле, множественные интерпретации, как правило, действительны.
Что вы действительно делаете при написании итератора для коллекции, такой как дерево, - это решение следующих проблем:
- Где начинается итерация коллекции (root? Leaves?)
- Как итерация переходит к следующему элементу (инфикс? Постфикс? Суффикс? Ширина?)
- Когда заканчивается итерация (выходит? Root? Final node?)
Что бы вы ни выбрали, вы должны четко понимать, как вы называете (и документируете) свой итератор, чтобы было понятно, как он будет посещать и испускать узлы.
Возможно, вам придется написать несколько итераторов для разных типов путешествий, которые вы намереваетесь поддерживать. Здесь есть несколько хороших статей, которые обсуждают модели обхода дерева .