我希望我的二进制树可以迭代,以便我可以循环访问每个节点一次。此外,inorder
是一个生成函数,它返回Iterator
,因此满足Iterable
契约。但是我的代码下面而不是产生每个节点只产生根节点,在这种情况下是A
。我做错了什么?
from collections import namedtuple
Node = namedtuple('Node', 'data, left, right')
root = Node('A',
Node('B', Node('D', None, None), Node('E', None, None)),
Node('C', None, Node('F', None, None)))
class BinaryTree(object):
def __init__(self, root=None):
self.root = root
def __iter__(self):
return self.inorder(self.root)
def inorder(self, node):
if node is None:
return
if node.left is not None:
self.inorder(node.left)
yield node
if node.right is not None:
self.inorder(node.right)
bt = BinaryTree(root)
for node in bt:
print node.data
答案 0 :(得分:2)
问题是你打电话给self.inorder(node.left)
,但没有对结果做任何事情,因此,代码只是执行(懒得好执行,这意味着没有执行),以及运行时环境继续到下一行。
您需要通过传播(即重新产生)通过调用inorder
生成的元素来解决它:
def inorder(self, node):
if node is None:
return
if node.left is not None:
for x in self.inorder(node.left) :
# you need to *re-yield* the elements of the left and right child
yield x
yield node
if node.right is not None:
for x in self.inorder(node.right) :
yield x