首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于inOrder遍历的生成函数

用于inOrder遍历的生成函数
EN

Stack Overflow用户
提问于 2018-01-29 16:35:51
回答 1查看 198关注 0票数 2

我最近一直在研究我的生成器函数和表达式,但我不太确定我该如何处理这个问题。如何使用生成器函数生成结果,然后按顺序打印值?

我使用pythons列表构建了我的BST

代码语言:javascript
复制
bst = [20, [10, [5, [2, [], []], [8, [], []]], [15, [], []]], [30, [25, [22, [], []], [27, [], []]], [35, [], [37, [], []]]]]

如果我打印顺序遍历,我没有问题。因此,如果我为以下函数调用inorder(bst)

代码语言:javascript
复制
def inorder(tree):
    if tree:
        inorder(tree[1])
        print (tree[0])
        inorder(tree[2])

我得到了这个输出。

代码语言:javascript
复制
2
5
8
10
15
20
22
25
27
30
35
37

我认为生成器表达式也同样简单。

代码语言:javascript
复制
def inorder(tree):
    if tree:
        inorder(tree[1])
        yield (tree[0])
        inorder(tree[2])

我遇到的问题是让我的main遍历函数中产生的内容。我以为它应该是这样的

代码语言:javascript
复制
test= inorder(bst)

for i in range(0,len(l)): # l is the number of items in bst
    print (next(test))

而不是迭代整个函数的结果,它只是简单地停止迭代似乎在它开始之前。

代码语言:javascript
复制
    20
Traceback (most recent call last):
  File "functionGenerator.py", line 64, in <module>
    print(next(test))
StopIteration

我需要做什么才能让我的函数发生器正确运行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-29 17:09:56

您的inorder()实现不能正确地递归。您只能打印树的当前顶层节点。这是因为只调用inorder(tree[1])inorder(tree[2])会返回一个生成器对象,而不是遍历这些生成器。

使用

代码语言:javascript
复制
def inorder(tree):
    if tree:
        yield from inorder(tree[1])
        yield tree[0]
        yield from inorder(tree[2])

yield from expression将生成器委托给另一个生成器,从该子生成器让步,直到完成为止。这样你就可以正确地递归了。

如果您使用的是较早的Python版本( Python 3.3之前),则需要手动迭代递归调用:

代码语言:javascript
复制
def inorder(tree):
    if tree:
        for sub in inorder(tree[1]):
            yield sub
        yield tree[0]
        for sub in inorder(tree[2]):
            yield sub

接下来,您可以遍历inorder()生成器:

代码语言:javascript
复制
>>> for node in inorder(bst):
...     print(node)
...
2
5
8
10
15
20
22
25
27
30
35
37

尽管使用next()也可以:

代码语言:javascript
复制
>>> tree = inorder(bst)
>>> print(next(tree))
2
>>> print(next(tree))
5

但是迭代更干净,一旦StopIteration被引发,它就会自动停止。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48497230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档