Aller au contenu

Diamètre d'un arbre

😀 On considère ici des arbres non étiquetés.

Définition du diamètre d'un arbre

Le diamètre d'un arbre est la plus grande distance entre deux nœuds.

Un tel chemin n'est pas nécessairement unique et il ne passe pas nécessairement par la racine. Pour l'arbre réduit à un nœud le diamètre vaut zéro.

Cette notion est générale aux graphes, dont les arbres enracinés font partie.

Arbre de diamètre 6

graph TB
    R{ } --- N1{ }
    R    --- N3{ }
    N1   --- N4{ }
    N1   --- N5{ }
    N3   --- N6{ }
    N3   --- N7{ }
    N3   --- N8{ }
    N4   --- N9{ }
    N6 --- N10{ }
    N6 --- N11{ }
    N6 --- N12{ }
    N6 --- N13{ }

Exercice

Coder une fonction diamètre qui prend un arbre non étiqueté en paramètre et qui renvoie son diamètre.

⚠ Les fonctions de tri sont interdites dans cet exercice, à vous de faire sans.

🥼 Indice

On peut résoudre efficacement ce problème par programmation dynamique.

On pensera alors à créer une fonction auxiliaire récursive qui renvoie un tuple (hauteur, diamètre).

On pourra alors écrire

🐍 Script Python
def diamètre(arbre):
    "Renvoie le diamètre de l'arbre"
    h, d = auxiliaire(arbre)
    return d
Guide
🐍 Script Python
def diamètre(arbre):
    "Renvoie le diamètre de l'arbre"

    def auxiliaire(arbre):
        "Renvoie le couple (hauteur, diamètre)"
        enfants = arbre
        h_max, d_max = ..., ...
        for enfant in enfants:
            h, d = auxiliaire(enfant)
            ...
            ...
        return ..., ...

    h, d = auxiliaire(arbre)
    return d
###(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/f78rnb _o=ylaepcwgu)vd4613kRmhtsP(S0+2è-i:050B0t0K0s0U0r0L0m0v0r0s0L0L0p010K0U0u010406050L0y0I0I0s0j0q040O0o0r0y0:0o0k050f0`0|0~100^0u04051g191j0f1g0^0B0U0A0(0*0,0.0J0U0x0J0r1x0J0K0?050Z0l0r0t1s0+0-011w1y1A1y0K1G1I1E0K0j1h0K0J1K1u010g0#0t0k0s0I0t010(130L0u0s0k0.0R1E1=1@1#1M1(1I1+1-0?0a0m0M0j0o0u0o0L0U160k0m0X1:0j0j0t0v2e191|0k1h0f1Z2r1W1Y1X1F0B1~0.1A0k1*2b1E1p1r0)1L2B0U2D0k0o2H1E0u2k1h2p2r2V0_1?2f2J1$2O0j0}0r0?0m0E2o2Z0@2Y1}2#1M2%2)2+0R2.1@2:2p2A012^0s2*040m0F2|2q0^2 2?0.32340m0C382~2Z303e2+0d3i3a3k3c310o2(332+0D3p2;2!1t2@3u2_350h3z3b3C3d3E3w350i3I3r3K3t3v3f0e3Q2=3S3m040E0P3X3B2K3T3F0E2-1a2/3q3Y3*3!0E2{3/2}3;3)2$3M340E373`393A3l3 0?0E3h433j3=3~3U483o4b1k2T192H2u0B1Y2z3s0v2P1.1h4m1i4k2X4i4s0X2U3R3*0G0?0X0g3i453s0w2+4K3J3?0g4H0U1,0S1W0t4P4E1$0=040N4Z4d2@0?0~0l2k4)3}1M4$0z0V3p0m4`0m4L3S0L1`04010H1*0A0o0U1J1I2g4U0I4W2k2g58004-2k013p064{4|4Q1$4G044I4:304N355u3s0k4S040s0y0b0#4U0U4/4i5p4=0?4(5K4!4+5C0j4.4Y5P4*0.4?4^4b5m5n4{4}3*4 0?525456581J4s0y0u590N0J5D0K0t0y0j0c5a4V4X0z5k5#5%5(5L3d0?1*0g1@0K0L3i5o5Q0.0o0?0p6h5)2$4,5T5J2V5$676p5R0J0n0}0b5y3S4$0c6o69314H6A0s6C4b6i5X016l046n6O6x6k0?0T6D3*0I0U486!4#0?6G6V6I6$0?3%66676P4;0.5r0g3u6H6j6J046c6e6}6Q0o5w2M736^6 710k6f6)5M045!6u6?5%6W6 0J7e5Y6+783l4H7r3s6S6U2V6@7s5C5E5G0!6t2/7l4$5O2X6I0k6b5A725W794?4_7j686~7M5s6L6N7y7l7w7u3Z0l0?6B7o017I7-7X0B7Z7-6F7(3?0?7n6-6~6S0Q7_6q046z7,7}740?8086796/043_7K6~7S6=7U7z5z7{7?8a307%8o5z7*04858f6Q7/7Q7A846M7@7q8r3Z7{8D040z7T6w6I5r2k0K5~188F7`838n7#6I7 811M8c3.8w7R8E8X7W6K8v3:6v8k8G838I6,8+6Q7;8!6X6T8|6 5D5F1A7E5V8(308y968l5S5U8I8K8i8;4F0?8P8R8 8{5#194B0t2r2S9q4l1q4n2u2x2s0s1H9t0f4m0^9D0Y0!0$04.