2010-09-20 22 views
0

Le problème:

J'ai un trie et je veux retourner les informations stockées. Certaines feuilles ont des informations (définies comme valeur> 0) et certaines ne le font pas. Je voudrais retourner seulement les feuilles qui ont une valeur.Comment utiliser un générateur pour itérer sur leafs d'un arbre

Comme dans tous les trie nombre de feuilles sur chaque noeud est variable, et la clé de chaque valeur est en fait composé du chemin nécessaire pour atteindre chaque feuille. J'essaye d'utiliser un générateur pour traverser le postorder de l'arbre, mais je n'arrive pas à le faire fonctionner. Qu'est-ce que je fais mal?

Mon Module:

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 

Exemple d'utilisation:

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

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

Je sais que l'exemple donné est simple et peut être résolu en utilisant toute autre structure de données. Cependant, il est important que ce programme utilise un trie car il est très bénéfique pour les modèles d'accès aux données.

Merci pour l'aide!

Note: J'ai omis les nouvelles lignes dans le bloc de code pour pouvoir copier-coller avec plus de facilité.

+0

BTW, vous pouvez changer les feuilles à feuilles –

+0

@ Tim Mcnamara. Le seul générateur en vue est un générateur _fonction_ pas un générateur _expression_. – aaronasterling

+0

Merci de nettoyer @Aaron, mon erreur. –

Répondre

2

changement

self.postorder(child) 

à

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

semble le faire fonctionner.

P.S. Il est très utile pour vous d'omettre les lignes vides pour faciliter la coupe & coller :)

+0

+1. Peut-être ajouter une récursion pour itérer sur des descendants plus profonds? –