Полезно подумать с точки зрения древовидной структуры и рекурсии и признать, что предварительный порядок, порядок в порядке и послепорядок являются тремя экземплярами рекурсии на дереве. Поскольку это домашнее задание, ИМО - настоящий вопрос, который вы должны задать «Как вы можете имитировать рекурсию со стеком?» Позвольте мне попытаться ответить на это с иллюстрациями на дереве. Скажем, дерево выглядит так
1
/\
2 3
И позволяет сказать, что у нас есть функция recurse
, которая работает следующим образом:
Защиту рекурсии узла: рекурсии (ребенок) над всеми детьми узла йоЗотеЬЫпд (узел)
Допустим, мы называем recurse
на 1. поток будет таким:
recurse 1
recurse 2
doSomething 2
recurse 3
doSomething 3
doSomething 1
Давайте попробуем написать это итеративно сейчас.
def iterate root:
//Let "stack" be the stack of nodes to process
stack.push(root)
while stack is not empty:
curr_node = stack.top()
if curr_node has a child that hasn't been processed:
stack.push(child)
else
doSomething(curr_node)
stack.pop()
и позволяет исследовать поведение iterate 1
:
iterate 1
stack 1
stack 2 1
doSomething 2
stack 1
stack 3 1
doSomething 3
stack 1
doSomething 1
Как вы можете видеть, порядок, в котором doSomething
был вызван на узлах идентичный в обеих рекурсивных и итеративных решениях.
Сначала сначала создайте рекурсивный алгоритм, затем убедитесь, что он прав. Как только вы закончите, преобразуйте его в нерекурсивное решение, использующее стек. – dasblinkenlight
Какое другое задание? Удалось ли вам писать код для этого –