Aller au contenu

Construction d'arbre binaire de recherche

La notion d'arbre binaire de recherche ne concerne que les arbres binaires dont les étiquettes sont comparables, par exemples toutes numériques, ou toutes des chaines de caractères.

Définition avec doublons à droite

Un arbre binaire de recherche est tel que, pour tout nœud, on a

  • son étiquette est strictement supérieure à toute valeur du sous-arbre à gauche,
  • son étiquette est inférieure ou égale à toute valeur du sous-arbre à droite.

Exemples d'ABR

graph TB
    A("8")
    B("3")
    C("15")
    D("2")
    E((" "))
    F("12")
    G("23")
    H((" "))
    I((" "))
    J((" "))
    K((" "))
    L((" "))
    M((" "))
    A --> B
    A --> C
    B --> D
    B --> E
    C --> F
    C --> G
    D --> H
    D --> I
    F --> J
    F --> K
    G --> L
    G --> M
graph TB
    A("8")
    B("3")
    C("15")
    D("2")
    E((" "))
    F("8")
    G("23")
    H((" "))
    I((" "))
    J((" "))
    K((" "))
    L((" "))
    M((" "))
    A --> B
    A --> C
    B --> D
    B --> E
    C --> F
    C --> G
    D --> H
    D --> I
    F --> J
    F --> K
    G --> L
    G --> M

Propriété récursive

Un arbre binaire de recherche est tel que

  • ou bien c'est un arbre binaire vide,
  • ou bien les trois points sont vérifiés.
    1. Sa racine porte une étiquette strictement supérieure ou égale à toute valeur du sous-arbre à gauche.
    2. Sa racine porte une étiquette inférieure ou égale à toute valeur du sous-arbre à droite.
    3. Les deux sous-arbres sont eux-même des arbres binaires de recherche.

Construction à partir d'un arbre binaire vide

Il est possible de construire l'ABR du premier exemple ci-dessus en partant d'un arbre binaire vide et en insérant successivement, et dans l'ordre, les nœuds suivants : [8, 3, 15, 2, 12, 23]. (Ce n'est pas la seule possibilité).

Exercice

Coder une fonction liste_vers_abr qui prend en paramètre valeurs une liste d'étiquettes et qui renvoie un arbre binaire de recherche représenté à l'aide de la classe Noeud construit avec l'ajout successif et dans l'ordre des valeurs.

⚠ L'arbre renvoyé doit être défini comme dans la section précédente, à l'aide de la classe Noeud. Il n'y a pas de classe ABR dans cet exercice. ⚠

👍 La méthode __eq__ de la classe Noeud est disponible, de sorte que vous pourrez faire des tests d'égalité entre arbres.

Méthode __eq__ de la classe Noeud
🐍 Script Python
class Noeud:
    def __init__(self, valeur, gauche=None, droite=None):
        self.valeur = valeur
        self.gauche = gauche
        self.droite = droite

    def __eq__(self, ab):
        """Test d'égalité récursif entre arbres binaires
        self est non vide, ab est peut-être vide
        """
        if ab is None:
            return False
        else:
            return (
                    (self.valeur == ab.valeur)
                and (self.gauche == ab.gauche)
                and (self.droite == ab.droite)
            )
###(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,59/f.78r;nb N_o=ylaepcwgu)vd4613kmhétsP(S0à2i:050E0w0N0v0V0u0O0o0y0u0v0O0O0s010N0V0x010406050O0B0K0K0v0k0t040R0r0u0B0;0r0m050f0{0}0 110_0x04051h1a1k0f1h0_0E0V0D0)0+0-0/0L0V0A0L0u1y0L0N0@050!0n0u0w1t0,0.011x1z1B1z0N1H1J1F0N0k1i0N0L1L1v010g0$0w0m0v0K0w010)140O0x0v0m0/0U1F1?1^1$1N1)1J1,1.0@0a0o0P0k0r0x0r0O0V170m0o0Y1;0k0k0w0y2f1a1}0m1i0f1!2s1X1Z1Y1G0E1 0/1B0m1+2c1F1q1s0*1M2C0V2E0m0r2I1F0x2l1i2q2s2W0`1@2g2K1%2P0k0~0u0@0o0H2p2!0^2Z1~2$1N2(2*2,0U2/1^2;2q2B012_0v2+040o0I2}2r0_302@0/33350o0F392 2!313f2,0d3j3b3l3d320r2)342,0G3q2=2#1u2^3v2`360i3A3c3D3e3F3x360j3J3s3L3u3w3g0e3R2?3T3n040H0S3Y3C2L3U3G0H2.1b2:3r3Z3+3#0H2|3:2~3=3*2%3N350H383{3a3B3m400@0H3i443k3?3 3V493p4c3}474g3$3z4j463t3^3I4c1l2U1a2I2v0E1Z2A3t0y2Q1/1i4y1j4w2Y4u4E0Y2V3S3+0J0@0Y0g3j4q3T0z2,4W3K3@0g0@1B0O0N0w0q0D0w0k0O0q0v0n0k4#4Q1%0?040Q4`4e2^0@0D340w0B4;503~1N4}0C0W3q060o5h0o4X4R4T0w4V4u4$1%4Z36593m4(042N0O4:2o5p4{5b0@4 5C513e0@4@5u3t4}0c3j5j5q52040b5M3T5c5e4j5i5#5R5D0/4S5x5o2W5%5I325K0n5Q5k1%0r5s0V0O5?5S5)0y0@0p180w5W3+4}5Z2W5g5$6b5@1N5*2l0N57194c5.5a5J0462560E654|5F6s5T5V5H6m015c3q6b5h6d5)0@0V5,2:6l3m0@6x5-6F010r0@020u0N0l5}5(5:045L6y316S040h6v6n541J576,6A0@683;6D5$6Q0m5;6;6)6+6%4r0@0A0v0B0y0L646k6Q6)0s6Y5/6|5x0m5z0k5B2Y5~6=4~6;7g6$7m6Z6 7q737577797t5/5O7e6z7g6O2:6Q6B5!6D6Q5*0w1B6J2~6L725U7E6(6T0A6W7W7U7s7I7n7v713!53556:7+666?6C6_5i6{6}7:5^0@707B7F4T292e7A6K7b0@7d7a7n7g5y5A0V186;4}5G7 6M6#5=7{1N7*8j7U0E824,8g0@5P896Z7G8v040C7?6c7n7O0%842~7J7=6k7T3T0y0H0@030)0,2h000M741B0N0M0o0l0o8c7k8e2g0T2h8t8J3a7@7^8a7`8q3T8p7(8z810r837#8{87923@6H7i8d8f8n0/8h7w8l6~7}9e8s908u9b7o8x6P8^7V9m7K696_7N0@6g6i952%8_3;6a6E9q7%7S8604889p6Z0J606o638E8O5l040g3v9A6w9Y0/5_979!6!6.56589s8M9u7M9G8m9M5/7c9(8b988+9a8`7;7p9m7r9=8}7C8w9_6N8B8D7L9F9N9x0Z9z8y7f9C3|1a4N0w2s2Tan4x1r4z2v2y2t4@1J2s4y0_0f0Y0!0$0O04.