class Arbre:
    def __init__(self,racine,*enfants):
        self.root = racine
        self.enfants = enfants
    
    """ Parcours""" 

    # en profondeur, ordre préfixe

    def prefixe(self, L = []):
        L.append(self.root)
        for child in self.enfants:
            child.prefixe(L)
        return L

    # en profondeur, ordre postfixe

    def postfixe(self, L = []):
        for child in self.enfants:
            child.postfixe(L)
        L.append(self.root)
        return L

    # en largeur

    def largeur(self):
        F = []
        L = []

        # Ajouter la racine et l'objet courant à L et F respectivement
        L.append(self.root)
        F.append(self)

        # Tant qu'il y a des éléments dans F
        while F != []:
            # Prendre le premier élément de F
            current = F.pop(0)

            # Ajouter tous les enfants à L et F
            for child in current.enfants:
                L.append(child.root)
                F.append(child)

        return L


    """ affichages """

    # sous forme de liste

    def afficher_liste(self, ordre):
        if ordre == 'prefixe':
            print(self.prefixe())
        elif ordre == 'postfixe':
             print(self.postfixe())
        elif ordre == 'largeur':
            print(self.largeur())

    # avec marges

    def affiche(self, space = 0):
        spaces = " " * space
        print(spaces, self.root)
        for child in self.enfants:
            child.affiche(space + 2)


tree = Arbre('A',
        Arbre('B',
            Arbre('C', 
                Arbre('D', Arbre('Z')), 
                Arbre('E', Arbre('X'), Arbre('Y'), Arbre('P'))),
            Arbre('F', Arbre('G'), Arbre('H'))),
        Arbre('I',
            Arbre('J', Arbre('K'), Arbre('L')),
            Arbre('M', Arbre('N'), Arbre('O'))))

tree.AfficheListe('prefixe')
tree.AfficheListe('postfixe')
tree.AfficheListe('largeur')
tree.Affiche()