2010-09-20 91 views
0

問題:

我有一個trie,我想返回存儲在其中的信息。一些葉子有信息(設置值> 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 

我知道給出的例子是簡單的,並且可以使用任何其他數據結構來解決。然而,這個程序使用一個trie是非常重要的,因爲它對於數據訪問模式是非常有益的。

感謝您的幫助!

注:我已經省略了代碼塊中的換行符,以便能夠更容易地進行復制粘貼。

+0

順便說一句,你可以改變葉子葉子 – 2010-09-21 00:04:53

+0

@Tim Mcnamara。目前唯一的發電機是發電機_功能_不是發電機_表達_。 – aaronasterling 2010-09-21 00:07:52

+0

感謝清理@Aaron,我的錯誤。 – 2010-09-21 00:26:24

回答

2

變化

self.postorder(child) 

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

似乎使其工作。

P.S.這對你來說很有幫助,可以省略空白行以便於切割&粘貼:)

+0

+1。也許增加遞歸迭代更深的後代? – 2010-09-21 00:02:58