Aller au contenu

Création d'arbre de Fibonacci

Arbre de Fibonacci

Il existe les nombres de Fibonacci, ici nous allons définir une famille d'arbres binaires !

Un arbre \(F_n\) de Fibonacci est un arbre binaire défini par récurrence pour \(n\in \mathbb N\) par

  • \(F_0\) est un arbre binaire vide.
  • \(F_1\) est un arbre binaire n'ayant qu'un seul nœud.
  • Pour \(n>1\), \(F_n\) est un arbre binaire dont le sous-arbre à gauche est un arbre \(F_{n-1}\) et le sous-arbre à droite est un arbre \(F_{n-2}\).

Propriété : Pour \(n\in \mathbb N\), \(F_n\) est de hauteur \(n\).

👍 Ces arbres sont utiles en informatique pour leur caractéristique d'équilibre ; notion que nous reverrons.

L'arbre de Fibonacci \(F_1\)

L'arbre de Fibonacci \(F_2\)

L'arbre de Fibonacci \(F_3\)

L'arbre de Fibonacci \(F_4\)

L'arbre de Fibonacci \(F_5\)

L'arbre de Fibonacci \(F_6\)

L'arbre de Fibonacci \(F_7\)

L'arbre de Fibonacci \(F_8\)

Fibonacci(4)

graph TB
    A("8")
    B("5")
    C("3")
    D("3")
    E("2")
    F("2")
    G((" "))
    H("2")
    I((" "))
    J((" "))
    K((" "))
    L((" "))
    M((" "))
    N((" "))
    O((" "))
    A --> B
    A --> C
    B --> D
    B --> E
    C --> F
    C --> G
    D --> H
    D --> I
    E --> J
    E --> K
    F --> L
    F --> M
    H --> N
    H --> O

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)
            )

Cette méthode permet de vérifier l'égalité entre deux arbres binaires non vides donnés par leur nœud racine. L'appel fonctionne aussi si l'un des deux ou les deux sont vides !

Les tests == internes se font alors avec des appels à __eq__ (de trois classes distinctes)

  • soit de la même classe Noeud, cette méthode est donc récursive
  • soit de la classe de None
  • soit de la classe des valeurs...

⚠ Relisez ceci attentivement et demandez des explications si nécessaire !

Arbre de Fibonacci portant le nombre de nil

Coder une fonction Fibonacci qui prend en paramètre un entier h et qui renvoie l'arbre de Fibonacci de hauteur h et dont chaque nœud porte une étiquette qui indique le nombre total de nil dans ses sous-arbres.

###(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 : /
.128013,59/f.q78rnb No=ylaepcwgu)vd46F13kRméhtsP(S0+2C-i:050C0u0N0t0X0s0O0n0w0s0t0O0O0q010N0X0v010406050O0z0K0K0t0k0r040R0p0s0z0?0p0l050e0}0 11130{0v04051j1c1m0e1j0{0C0X0B0+0-0/0;0M0X0y0M0s1A0M0N0_050$0m0s0u1v0.0:011z1B1D1B0N1J1L1H0N0k1k0N0M1N1x010f0(0u0l0t0K0u010+160O0v0t0l0;0U1H1^1`1(1P1+1L1.1:0_0a0n0P0k0p0v0p0O0X190l0n0!1?0k0k0u0w2h1c1 0l1k0e1$2u1Z1#1!1I0C210;1D0l1-2e1H1s1u0,1O2E0X2G0l0p2K1H0v2n1k2s2u2Y0|1_2i2M1)2R0k100s0_0n0G2r2$0`2#202(1P2*2,2.0U2;1`2?2s2D012{0t2-040n0H2 2t0{322_0;35370n0D3b312$333h2.0c3l3d3n3f340p2+362.0E3s2@2%1w2`3x2|380i3C3e3F3g3H3z380j3L3u3N3w3y3i0d3T2^3V3p040G0S3!3E2N3W3I0G2:1d2=3t3#3-3%0G2~3=303@3,2)3P370G3a3}3c3D3o420_0G3k463m3^413X4b3r4e3 494i3(3B4l483v3`3K4r3M3_4a3(3S4w3U4y4o0G3Z4C4g3G4o0U3*4I404K3I0U3;2Y4m4t4z0U3|2!1p2W1c2K2x0C1#2C3v0w2S1;1k4(1l4$4!2!4.0!2X4D1)0I0_0!0f3l4s3V0x2.534x2)0f0_0F0X0m1a0t0w0w0X584}1P0^040Q5l4J3g0_0M5r4P0;5o0A0Y3+3356380n5G5w330O0C0_015N5C3v5K2.5G0n0J1-0B0p0X1M0z2i110m2n0n0m2P0%5)2k5d5f1.5i0X2j1M0M0t180u0z0k0n0M0g5P3V5R5F5G0V5`0h0z1M0L0?6a0#0N1M2P1s6f0n1L0n2R0K5(1M0l0(0n0N0p0$0s2j0z0n0O0p0z0O0W5%5)1O0p5j0L624O5J5L660n5N013s5T0n543-4 040X524e6Y592`5u3l6*5m0;0p0_0q0q6.6Z1)0K0X0_4N2!6+5y0_5B4l6X6X6`1P6#2n0N5~1b6)780;0I0w0_0o1a0u6W5T7g016#0u1D6(2Y6/5s346-7f71016=046@6_7C6|4b5I3v5o744U767p7C7a0#7d7H6:7z047l5}0C7L3V5o5q4e7q7J044Z2=7q5z7o5H7S0_7t0O7n7+7C7N7?767q0l0_0y5{0w0M7|7w7q7E6^7B7X83045:5g5?7%3-7)8l2)7A8a7C7E0W7W7y7-4T7:7~0_0A80777C8g0C2b2g892=7x5x7D6?8v8N8g8i5=5j8o5n0_7*708f8q8L8b0_8u8e8w6}7.8W72048C757Q8M3o0_0B365}0k8Q338c8 3v7-6 3?8@8^3v6#6%923$8486889c3-0p5E0X0O9h4~7j7Z7m8/017 8?977@8#048{1L5~9n1P7E0T8d8r7X8x8D7R7X7s0)8K307;739L7Q828`8|9C8+8N9F9H8%8F9e0z879Q2t8(046O8!7y8g9A8}9U983V9a7v9(9y8H5Y6h9D6;9k9m9!337i7k9r7}7X9u7P9w9x9?9X9B8~a83v9$a4019K9v817^047`9-4|7yaf96ah9{3_ak9_an3VapaIaF04a18J9s7E9;8z9y9^9Zag9Vav7b7VaL8p9q7#9s8nadaj9z9Yam9=8N5o0baq8g859+9ga,a=0_a@a$6,aN8Ia3a}337=4r0e4`0u2u2Vbc4%1t4)2x2A2v0t1Kbf0e4(0{bp0#0%0)04.