Да, но код должен быть структурирован по-другому. Надлежащее основанное на стеке моделирование рекурсивного алгоритма должно сохранять узел в стеке до тех пор, пока узел и его дочерние элементы не будут полностью пройдены. Стек должен содержать экземпляры класса, который содержит информацию о том, сколько дочерних объектов было пройдено, скажем:
public class StackElement<T> {
public Tree<T> node;
public int numTraversedChildren;
}
(использование открытых полей для простоты). Всякий раз, когда вы помещаете узел в стек, нажимайте StackElement
, который ссылается на этот узел, а numTraversedChildren
равен 0. В верхней части цикла посмотрите (не выдвигайте) стек, чтобы найти верхний элемент. Если и только если numTraversedChildren == 2
, вы знаете, что все дочерние узлы этого узла были пройдены. В этом случае вы можете обработать (в вашем случае распечатать) этот узел, а затем извлечь его. В противном случае оставьте узел в стеке, увеличьте значение numTraversedChildren
и вставьте его левый дочерний элемент (если старое значение numTraversedChildren
было равно 0) или его правый дочерний элемент (если старое значение numTraversedChildren
было равно 1).
Обратите внимание, что при использовании этого подхода цикл while
и операции push / pop в стеке эффективно имитируют вызовы функций: push - это вызов, pop - это возврат, а стек поддерживает все параметры и локальные переменные для каждого вызова функции. Элемент в верхней части стека всегда представляет функцию, которая выполняется в данный момент.