Цель стека состоит в том, чтобы моделировать рекурсию.
Начальное значение, помещаемое в стек, - это само дерево (в форме его корневого узла).Его значение извлекается, а затем каждое поддерево помещается в стек.На следующей итерации цикла левый дочерний элемент удаляется, обрабатывается и заменяется на его дочерних элементов, если таковые имеются.Цикл продолжается до тех пор, пока в стеке есть что-то для обработки.Как только все на левой стороне дерева будет обработано, вы, наконец, начнете на правом дочернем элементе (поместите стек в начало цикла).
Сравните с рекурсивной версией:
def preorder_recursive(self):
result = [self.get_root_val()]
if node.left_child:
result.extend(node.left_child.preorder_recursive())
if node.right_child:
result.extend(node.right_child.preorder_recursive())
return result
Каждый рекурсивный вызов по существу помещает self
в стек, позволяя обработать левый дочерний элемент (и его потомков), прежде чем в конечном итоге вернуться к корню и перейти к правому дочернему элементу.