この種の (クロージャーを使用する) イテレーターは、Python ではジェネレーターと呼ばれます。
ジェネレーターは関数であり、「return」の代わりに「yield」キーワードを使用します。yield が発生すると、それぞれの値が返されますが、関数の実行状態は、次の値が必要になるまで中断されます。
したがって、「return」の代わりに「yield」を使用して、ツリー トラバーサル関数を実装するだけで、目的が達成されます。
設計は非常に簡単です。
# Simple tree definition
class Tree:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
# In-order lazy iterator (aka generator)
def inorder(tree):
if tree is not None:
for x in inorder(tree.left):
yield x
yield tree.data
for x in inorder(tree.right):
yield x
# Reverse in-order lazy iterator
def rev_inorder(tree):
if tree is not None:
for x in rev_inorder(tree.right):
yield x
yield tree.data
for x in rev_inorder(tree.left):
yield x
# Construct a tree
n1 = Tree(1)
n2 = Tree(2)
n3 = Tree(3) # 7
n4 = Tree(4) # / \
n5 = Tree(5, n1, n2) # 5 6
n6 = Tree(6, n3, n4) # / \ / \
n7 = Tree(7, n5, n6) # 1 2 3 4
for i in inorder(n7):
print i,
print
for i in rev_inorder(n7):
print i,
print
出力:
1 5 2 7 3 6 4
4 6 3 7 2 5 1
手動で反復するには、次を使用します。
gen = rev_inorder(n7)
print gen.next() # Output 4
print gen.next() # Output 6