キューまたはスタックを使用します。キューまたはスタックから要素を取り出し、その値を実行中の合計に追加し、任意の子をキューまたはスタックに追加してから、次の要素を処理します。キューまたはスタックが空のときに終了するループ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
私は幅優先探索に探してお勧めします。一般的に、深さ優先探索は再帰的に行い、幅優先探索は反復的に実行します。 –
ツリーをトラバースすることは、再帰的な解法がはるかに簡単な場合の1つです。これを繰り返し行うことは、まったく利益のためにはるかに複雑になります。 – jasonharper