Aller au contenu

Construction d'arbre binaire presque complet à gauche

Définition

Un arbre binaire est (presque) complet à gauche s'il possède toutes ses feuilles presque à la même profondeur (à 1 près). De plus les feuilles manquantes éventuelles sont toutes du même côté, à droite.

Propriété

Lors d'un parcours en largeur d'un arbre presque complet à gauche, on rencontre tous les nœuds, ensuite les nil.

Réciproquement, on peut reconstruire un unique arbre binaire presque complet à gauche à partir d'une liste d'étiquettes.

Un arbre presque complet à gauche

Pour alléger, il est inutile de dessiner certains nil dans ce cas... Ils existent néanmoins !

graph TB
    N0("42")
    N0 --> N00("13")
    N0 --> N01("7")
    N00 --> N000("5")
    N00 --> N001("21")
    N01 --> N010("18")
    N01 --> N011("17")
    N000 --> N0000("2")
    N000 --> N0001("9")
    N001 --> N0010("4")
    N001 --> N0011("1")
    N010 --> N1000("6")
    N010 --> N1001(" ")
    N011 --> N1010(" ")
    N011 --> N1011(" ")
🐍 Script Python
liste_largeur = [42, 13, 7, 5, 21, 18, 17, 2, 9, 4, 1, 6]

Ci-dessus, la liste des étiquettes issue du parcours en largeur de l'arbre. On peut alors reconstruire sans équivoque cet arbre binaire presque complet à gauche.

Exercice

Coder une fonction construit_complet

  • qui prend en paramètre valeurs la liste des étiquettes issues du parcours en largeur de l'arbre binaire presque complet à gauche ab que l'on souhaite construire ;
  • et qui renvoie ab l'unique arbre binaire presque complet à gauche associé, représenté à l'aide de la classe Noeud.
Classe Noeud
🐍 Script Python
class Noeud:
    def __init__(self, valeur, gauche=None, droite=None):
        self.valeur = valeur
        self.gauche = gauche
        self.droite = droite

    def __repr__(self):
        """Pour afficher la définition de l'arbre binaire ab,
        en console ; il suffit de faire :

        >>> ab
        """
        ...

    def __str__(self):
        "Pour afficher un petit arbre binaire en console"
        ...

    def __eq__(self, autre):
        "Test d'égalité récursif entre arbres binaires"
        ...

Un arbre binaire est donné soit par None s'il est vide, soit par son nœud racine.

Méthode __repr__

Cette méthode permet d'afficher une façon de définir un arbre la classe Noeud

On peut alors utiliser >>> ab (ou repr(ab)) pour afficher une définition de l'arbre dans la console Python.

Cet appel reste valable même si ab est vide. Auquel cas, la méthode __repr__ de None est appelée (mais pas celle de la classe Noeud).

Méthode __str__

Cette méthode permet d'afficher un arbre défini avec la classe Noeud

On peut alors utiliser print(ab) (ou str(ab)) pour afficher ab dans la console Python. Appel sans erreur, même si ab est vide.

Méthode __eq__

Cette méthode permet de vérifier l'égalité entre deux arbres binaires.

Les tests == internes se font avec un appel à __eq__ de la même classe Noeud (ou de None), donc cette méthode est récursive.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013x/r;nbylaeu)*d63Am(P+02],59fq7B8 N_o=pcwgv41`kRéhtsSàC[i:050o0k0Y0j0(0i0Z0H0N0i0j0Z0Z0L010Y0(0M010406050Z0l0s0s0j0d0h040!0K0i0l0}0K0f050c1416181a120M04051q1j1t0c1q120o0(0Q0=0@0_0{0X0(0P0X0i1H0X0Y10050-0g0i0k1C0^0`011G1I1K1I0Y1Q1S1O0Y0d1r0Y0X1U1E010C0/0k0f0j0s0k010=1d0Z0M0j0f0{0x1O1 211/1W1=1S1^1`100a0H0u0d0K0M0K0Z0(1g0f0H0+1}0d0d0k0N2o1j260f1r0c1-2B1*1,1+1P0o280{1K0f1@2l1O1z1B0?1V2L0(2N0f0K2R1O0M2u1r2z2B2)13202p2T1:2Y0d170i100H0S2y2-112,272/1W2;2?2^0x2{212}2z2K01320j2@040H0q362A1239300{3c3e0H0R3i382-3a3o2^0A3s3k3u3m3b0K2=3d2^0p3z2~2.1D313E333f0E3J3l3M3n3O3G3f0G3S3B3U3D3F3p0B3!2 3$3w040S0w3+3L2U3%3P0S2`1k2|3A3,3@3.0S353|373~3?2:3W3e0S3h443j3K3v49100S3r4d3t3 483(4i3y4l464g4p3/3I4s4f3C413R4l1u2%1j2R2E0o1,2J3C0N2Z1{1r4H1s4F2+4D4N0+2(3#3@0U100+0C3s4z3$0O2^4)3T400C104N0f0Z1*0l2n0J4N0s0M1S0Y4.4Z1:0 040t524n31100Q3d0k0l0d0Z58471W550m0)3z0H5p0H4*3@0Z2404010V1@0Q0K0(1T0i000r0F0H2$0k0Z0D0l1T4}4 0,0H0#0H0P0j0l0N0X1T2r1K4^5!000W0}5M0,0Y5K0H0T5c1S5f0Z0T013z065q5r4/1:0N0S10030H0$5-1T0C1h2w0(1h0H5K0Y2q0W1=0f5C5S0H5E2W0Y0W0d5C5f2q5D005W1*0k5o5q5s1:4#044%5i3a4,3f6I4A4;044?4^0d4`0Y4|0K4~500J5W0b6M3$55574D5 5a045=5e5g6$3@550z3s5~536,0(6;54105m6B5}5p6D1W5u105x5z5B1T0l2p180g2u2q1h6g0@0H0d0j0N2W1T6f0H6.5@0%0(0y5`4s726C6+0{6F0(4(4l6_593n106|7H740{0K10020P0Y0e0L6^7O3b0g102b6}5k106)2+7C3b5b5d5@7%0{5l5n7z7A727Y6F2u0Y5f1i7N7,0U0N100I1h6A7^7A7{100k0:887+6`7=107@2)5|7_5}8b047}7 7X7,0f850K5e0o7;016(718n7`8u7.5?6:6*8h8B100%8A8v047M8g7J8M040y6@898E8o8G6P1h6R6T6V6X0,6Z0l6#8K8U8C8;5j7K6-7/8J8T8^8V8Y2)7I8~0s0(10438}3a7Q040n8P7L8t8L9a0v9f8U944i8A5l903}8!8a8$6Q4_4{5P6Y6!9n7)9d8`8I5h8@3a6?9j939504972|7Y9a9c9G4A9e819g109i9V9k9L9N377Y5l8D8n9(6 5{8#8L61630H5y0Y0K6u5T7k690f6b6d2$2W7o201S8D8p8r0d80917Y8Q9u6S9w6W5Q6U9z9S6%9Bal408H6/9F983C9I9Z9K103;ao6~040m3J0c4W0k2B5J2B4R2C4J1j2FaO0j1RaH4G1A2}0c0+0-0/0Z04.