如何使用生成器遍历树的叶子节点

0 投票
1 回答
2186 浏览
提问于 2025-04-16 04:23

问题:

我有一个字典树,我想把里面存储的信息拿出来。有些叶子节点有信息(值大于0),而有些没有。我只想返回那些有值的叶子节点。

在字典树中,每个节点的叶子数量是不固定的,而每个值的关键字实际上是到达每个叶子节点所需的路径。

我想用生成器来后序遍历这个树,但我搞不定。我的做法哪里出错了呢?

我的模块:

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

我知道这个例子很简单,可以用其他数据结构解决。但这个程序必须使用字典树,因为它对数据访问模式非常有帮助。

谢谢你的帮助!

注意:我在代码块中省略了换行,以便更方便地复制粘贴。

1 个回答

2

self.postorder(child)

改成

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

似乎就能让它正常工作了。

附言:省略空行会让你更方便复制和粘贴,真的很有帮助哦 :)

撰写回答