我有一个标准的二进制树,读起来像
1
/ \
2 3
/ \ / \
4 5 6 7
我需要通过导入我的树类来读取二叉树,创建这个树,然后使用for循环来读取它:[4,2,5,1,6,3,7]
我已经创建了树,我的程序将生成一个包含任意数量的树。我的问题在于方法。
def iter (自我):
到目前为止,我有:
def __iter__(self):
if self.left:
self.left.__iter__()
yield self
if self.right:
self.right.__iter__()
但是当我在树对象上运行for循环时,如:
表示树中的项目: print(“{}:{}”)。format(item.name,item.height())
它只打印我尝试中具有正确高度的第一个节点。
我的问题基本上是,如何使用递归打印这个二叉树?
答案 0 :(得分:7)
在Python> = 3.3中,可以使用def __iter__(self):
if self.left:
yield from self.left
yield self
if self.right:
yield from self.right
语法进行递归迭代:
exslt:node-set('default value') | @IfThisNodeExists
编辑:Python 3.3支持确认。
答案 1 :(得分:0)
没试过,但可能更像是:
def __iter__(self):
if self.left:
for k in self.left:
yield k
yield self
if self.right:
for k in self.right:
yield k
但请先检查一下。
答案 2 :(得分:0)
集合中的下一个元素应由__next__()
返回:What is the interface for python iterators?
__iter__()
应该返回一个迭代器,一个定义__next__()
方法的对象。 yield
在生成器中使用,它与迭代器的概念完全不同,但你可以使用生成器函数(因为它是迭代器),即:
class A:
def __init__(self, val, a=None, b=None):
self.left = a
self.right = b
self.val = val
def __iter__(self):
def generator():
if self.left:
for leaf in self.left:
yield leaf
yield self
if self.right:
for leaf in self.right:
yield leaf
return generator()
for i in A(3, A(5, A(2), A(1)), A(4)):
print(i.val)