Использовать очередь или стек; возьмите элемент из своей очереди или стека, добавьте значение к общему количеству, добавьте в очередь или стек любых детей, а затем обработайте следующий элемент. Используйте цикл while
, который заканчивается, когда ваша очередь или стек пуста.
Единственная разница между стеком и очередью заключается в том, что вы либо сначала обрабатываете глубину элементов (стек), либо сначала задыхаетесь (очередь).
Ваш рекурсивный код глубины первого, так чтобы повторить то же самое поведение итеративно использовать стек:
def sum_nodes_iteratively(root):
elements = [root]
total = 0
while elements:
element = elements.pop()
elements.extend(element.children)
total += element.value
return total
Демо:
>>> class Node(object):
... def __init__(self, value, children):
... self.value = value
... self.children = children
...
>>> def sum_nodes_iteratively(root):
... elements = [root]
... total = 0
... while elements:
... element = elements.pop()
... elements.extend(element.children)
... total += element.value
... return total
...
>>> sum_nodes_iteratively(Node(1,[Node(2,[]),Node(3,[Node(4,[Node(5,[]),Node(6,[Node(7,[])])])])]))
28
Я бы рекомендовал смотреть в поиск в ширину. Как правило, вы хотите рекурсивно выполнять поиск по глубине и поиск по ширине итеративно. –
Прохождение дерева - один из тех случаев, когда рекурсивное решение является самым простым. Выполнение этого итеративно было бы намного сложнее, без какой бы то ни было пользы. – jasonharper