2017-04-12 3 views
0

Je crée une classe python pour un arbre dans lequel chaque nœud a un nombre d'enfants donné par "order" (mais chaque enfant n'a qu'un seul nœud). J'ai une méthode, enfants (self, i), qui renvoie les enfants d'un noeud à l'index i. J'ai besoin d'implémenter parent (self, i) qui obtiendra le parent d'un enfant à l'index i.Python - Implémentation d'une arborescence de liste plate: Étant donné un enfant, obtenir un parent?

Voici ce que j'ai jusqu'à présent:

class Tree: 
    def __init__(self, order=2, l=[]): 
    self._tree = l 
    self._order = order 

    def children(self, i): 
    left = self._tree[(i+1)*self._order-1] 
    right = self._tree[(i+1)*self._order] 
    return [left, right] 

    def parent(self, i): 
    if i>len(self._tree): 
     return ValueError 
    elif i==0: 
     return None 
    else: 
     #get parent of node i 

Un arbre exemple représenté par ordre = 2 et la liste [45, 2, 123, 1, 8, 40, 456] ressemblerait à ceci:

 45 
    / \ 
    2  123 
/\ / \ 
1 8 40 456 

Je sais qu'il y a probablement un moyen de renverser la méthode que j'ai utilisée pour les enfants (self, je) mais je ne sais pas comment.

+0

Est-ce que n est supposé être un paramètre, ou est-ce que ça va toujours être un arbre binaire? – user2357112

+0

désolé, le nombre d'enfants est donné par l'entrée "commande". éditer pour que cela soit plus clair –

+0

Votre méthode 'children' est détruite, alors. Il suppose qu'il y a exactement 2 enfants. – user2357112

Répondre

0

Vous feriez l'opération inverse:

else: 
    #get parent of node i 
    return self._tree[(i-1)//self._order] 

Notez que votre implémentation ne fonctionne que pour les arbres binaires (vous revenez deux enfants, pas n). Corrigez-le comme ceci:

def children(self, i): 
    return self._tree[(i*self._order+1):((i+1)*self._order+1)] 
+0

Merci! Cela fonctionne parfaitement –