如何使用生成器遍历树的叶子节点
问题:
我有一个字典树,我想把里面存储的信息拿出来。有些叶子节点有信息(值大于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
似乎就能让它正常工作了。
附言:省略空行会让你更方便复制和粘贴,真的很有帮助哦 :)