【问题标题】:Reading a Binary Tree using __iter__使用 __iter__ 读取二叉树
【发布时间】:2016-02-13 00:41:03
【问题描述】:

我有一个标准的二叉树,读起来像
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())

它只以正确的高度打印我尝试中的第一个节点。

我的问题基本上是,如何使用递归打印这个二叉树?

【问题讨论】:

  • 我只是在做一些关于同一件事的研究,我发现了这个新的二叉树模块。它已经提供了不同的方法来列出元素甚至打印树结构。 This is the link where I found the module.我希望它有所帮助。

标签: python python-3.x


【解决方案1】:

在 Python >= 3.3 中,可以将 yield from x 语法用于递归迭代器:

def __iter__(self):
    if self.left:
        yield from self.left
    yield self
    if self.right:
        yield from self.right

编辑:确认支持 Python 3.3。

【讨论】:

    【解决方案2】:

    集合中的下一个元素应该由__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)
    

    【讨论】:

      【解决方案3】:

      没有尝试过,但可能是这样的:

      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
      

      但先检查一下。

      【讨论】:

      • 假设如果self.left 是虚假的,for k in self.left 将永远不会进入正文,从而使if 检查变得多余。
      猜你喜欢
      • 2013-01-25
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2017-04-14
      • 2018-11-25
      • 2012-01-09
      相关资源
      最近更新 更多