如何使用生成器迭代树的叶子

时间:2010-09-20 20:32:11

标签: python tree generator

问题:

我有一个trie,我想要返回存储在其中的信息。一些叶子有信息(设置为值> 0)而一些叶子没有。我想只返回那些有价值的叶子。

因为在每个节点上所有trie的叶子数量都是可变的,并且每个值的键实际上由到达每个叶子所需的路径组成。

我正在尝试使用生成器遍历树后序,但我无法让它工作。我做错了什么?

我的模块:

class Node():
    '''Each leaf in the trie is a Node() class'''
    def __init__(self):
        self.children = {}
        self.value = 0

class Trie():
    '''The Trie() holds all nodes and can return a list of their values'''
    def __init__(self):
        self.root = Node()
    def add(self, key, value):
        '''Store a "value" in a position "key"'''
        node = self.root
        for digit in key:
            number = digit
            if number not in node.children:
                node.children[number] = Node()
            node = node.children[number]
        node.value = value
    def __iter__(self):
        return self.postorder(self.root)
    def postorder(self, node):
        if node:
            for child in node.children.values():
                self.postorder(child)
            # Do my printing / job related stuff here
            if node.value > 0:
                yield node.value

使用示例:

>>trie = Trie()
>>trie.add('foo', 3)
>>trie.add('foobar', 5)
>>trie.add('fobaz', 23)

>>for key in trie:
>>....print key
>>
3
5
23

我知道给出的示例很简单,可以使用任何其他数据结构来解决。但是,对于此程序而言,使用trie非常重要,因为它对数据访问模式非常有益。

感谢您的帮助!

注意:我在代码块中省略了换行符,以便能够更轻松地进行复制粘贴。

1 个答案:

答案 0 :(得分:2)

更改

self.postorder(child)

for n in self.postorder(child):
    yield n

似乎让它发挥作用。

P.S。为了方便切割而省略空白行是非常有帮助的。粘贴:))