Все остальные ответы - технические дискуссии о том, как реализовать итератор в древовидной структуре. Однако, как я понимаю ваш вопрос, у вас, похоже, возникают проблемы с пониманием механики концепции обхода дерева, а не только ее реализации. Другими словами, вы не «прогуливаете» обход дерева. Что, вероятно, поможет больше всего на свете, это получить хороший алгоритм псевдокода для обхода двоичного дерева, карандаша, листа бумаги и разработать пример. Создайте простое двоичное дерево, а затем обойдите его, механически самостоятельно следуя псевдокоду. Вам, вероятно, следует использовать второй лист бумаги для записи стопки . То есть состояние каждой функции, которая находится в середине вызова, потому что она ожидает возврата подфункции.
Имейте в виду, что при этом дерево очень элегантная структура. Это может показаться довольно сложным, но на каждом узле это просто. Чтобы выполнить операцию со всеми элементами дерева, вы просто выполняете эту операцию в корне дерева, а затем вызываете саму операцию для каждого дочернего элемента этого корня, которые сами являются корнями поддеревьев. Самостоятельная работа над примером поможет вам понять и принять рекурсию. Не сбивайтесь с толку, если вам трудно. Рекурсия странная. Поначалу это сложная концепция, но с деревьями нужно разбираться и работать.
Вот пример дерева (ASCII art), которое вы можете использовать для запуска:
F
/ \
/ \
D H
/ \ / \
B E G I
/ \
A C
И простой алгоритм псевдокода, который вы можете использовать для написания всех букв в правильном порядке обхода.
procedure traverse(node)
if node is not null:
traverse(node.left)
write node.letter
traverse(node.right)
else:
do nothing
Вы можете даже начать с более простых деревьев. Что если дерево состоит только из узлов D, F и H? Что если бы это был только F? Ноль? Попробуйте эти простые примеры и перейдите к большему дереву. К тому времени, как вы научитесь делать это последовательно и правильно, у вас будет не только действительно хорошее представление о том, что происходит в реализации итератора, но и вы будете гораздо лучше понимать силу рекурсии.