class Noeud:
    def __init__(self, valeur, fils_g=None, fils_d=None):
        self.val = valeur
        self.gauche = fils_g
        self.droite = fils_d

def hauteur(a, h=1):
    if not a: return 0
    hg = hauteur(a.gauche, h+1)
    hd = hauteur(a.droite, h+1)
    return max((h, hg, hd))

def aff_arbre(a, niveau=0, cols=None):
    if cols is None: cols = []
    if a.gauche is not None:
        aff_arbre(a.gauche, niveau+1, cols)
    cols.append(" " * niveau + str(a.val))
    cols.append(" ")
    if a.droite is not None:
        aff_arbre(a.droite, niveau+1, cols)
    if niveau == 0:
        h = hauteur(a)
        for i,s in enumerate(cols):  # Ajuste la longueur de toutes les représentations
            cols[i] = s + "   " * (h - len(s))
        for i in range(h):           # Bascule les représentations
            s = ''.join(x[i] for x in cols)
            print(s)
            print()

arbre = Noeud("A", Noeud("B", Noeud("C"), Noeud("D")), Noeud("E"))
print(f"Hauteur: {hauteur(arbre)}")  # → Hauteur: 3
aff_arbre(arbre)
#      A
#
#  B     E
#
#C   D

print("Ajout noeuds...")                # → Ajout noeuds...
noeude = arbre.droite
noeude.gauche = Noeud("F")
noeude.droite = Noeud("G")
aff_arbre(arbre)
#      A
#
#  B       E
#
#C   D   F   G