Taille et hauteur d'un arbre (3)

Différentes représentations

Cet exercice demande d'écrire les fonctions calculant la taille et hauteur d'un arbre. Il fait partie d'une série dans laquelle on utilise différentes représentations :

Dans tout le sujet, on considère des arbres enracinés. On rappelle que les arbres binaires ne sont pas des arbres enracinés.

On rappelle la définition d'un arbre enraciné : il s'agit d'une racine qui possède \(0\), \(1\) ou plusieurs sous-arbres qui sont eux-mêmes des arbres enracinés.

Un arbre enraciné qui ne possède pas de sous-arbre est appelé feuille.

On représente un arbre enraciné par un tuple contenant deux éléments : la valeur portée par la racine et la liste des sous-arbres. Une feuille est donc représentée par (x, [])x est une valeur quelconque.

L'arbre représenté par ("a", [("b", []), ("c", []), ("d", [("e", [])])]) a quant à lui une racine portant la valeur "a" et possède trois sous-arbres :

  • le premier est une feuille,

  • le deuxième est une feuille,

  • le troisième est un arbre qui a un sous-arbre qui est une feuille.

Cet arbre se dessine ainsi :

graph TD
    R{a} --> N1{b}
    R    --> N2{c}
    R    --> N3{d}
    N3   --> N4{e}

Dans cet exercice, la définition de la hauteur d'un arbre est le nombre maximal de filiations pour rejoindre la racine à une feuille. Un arbre réduit à sa racine a donc une hauteur égale à \(0\).

1. Taille de l'arbre

Écrire la fonction taille qui prend en paramètre une liste représentant un arbre et renvoie sa taille.

Exemples
>>> taille(("a", []))
1
>>> taille(("a", [("b", []), ("c", []), ("d", [("e", [])])]))
5

###(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 : 10/10

.1280131=0(P5tiCS;lmsf+àok.e/cw[):nq23pLhuvréby_]dg 4Ra050R0v0h0W0i0m0o0T0x0m0W0o0o0c010h0i0G010406050o0J0n0n0W0L0O040k0s0m0J0;0s0C0T020W0n0G0l0T0V0v0~0L0D0J0v0o050w0{0}0 110_0G041p1w051z0w1z1B1w0_0R0i0K0)0+0-0/0I0i0S0I0m1P0I0h0@050!0N0m0v1K0,0.011O1Q1S1Q0h1Y1!1W0h0N0s0R111X0L1x0h0I0)140o0G0W0C0/0E011$1M010p0$0v0C1c0v1W2123281(2b1!2e0n2g040a0T0f0L0s0G0s0o0i17190Y1 0L0L0v0x2B1p2i0C1x0w1}2N0h1{1`1|0R2k0/1S0C2d2y1W1H1J0*1%2X0i2Z0C1@1I1W0G2G1x2L2N2^0`22192)292.0L0~0m0@0b2K2|0^2{2j2~1(30320@0E3623382L2W013d0W33040F3h2M0_3k3b0/3n3p0U3s3j2|3l3y0@0g3B1y2?1p2%2Q0R2U3l0x1@2q0X1I1x2=0v2@373I3R0Y3Z3a1L1(0t0@0Y0p3I3v3*0/0y0@0T3:3D3w3m0p0@0!0$1!3`3)2*010?040e432}3=3m0@0 0N2G4a3l470A0B3B060T4p3_3;450C3 3B4r3{4c0s0@0c4w394b450n0i344n4q4x44293,040p0s0L4D4s2 0@0o0s0J0o0P4f4h1q374M4F290s3@042,4U4y4t4e0L4g0v4i3|470z4|4c4H4J4)3i4E4j0@0Q4m543t4L4L563|4u040h4=4N1(4A044C5b044+3E4v5q5s3|5n0q5k4,3c3 0#0m425q5f4c47495H4V5C044Y4!4$4_4(2`5N0/4k4K4q5I454P2G0h0J0L0C5A5t5i4n1p3$3Y3J5?0w3M1p0h3O5{2S2O1?1^2Q0W1Z5^3M1v3(5B0/2G0n0P0p0W0t0v0P0I0F0@1h1j1l1n0T5a2`1C381w0H0W0T4R0C2I0i183_5=3l1*1R1T1V693E0N4X0|3I0w5=5r2D0f0O1}6E0G0v310Z0T0R003o0m0M0S6#0T1!1 2D5a1F3U2(4c6I1,1U2h4?292m2d2f0@2s0k0x0L0=0h2t6X0I183I3X692_3!6T5#4O3-0v3/5M701(4/3_7r5l3x3~5i5E5G5V7s5X0@5L7D7x4d044%4{7w6a460@4l5Z4p7m3+0@5(5*5,5v7V0/5204357#5W015y5-5g6O5P6Q7O5748504@7A417N7I7P5K7`4W5P4Z4#7M821(5Y7+7E014P4R4T8b7J5h5Q865T7~4*7$7-4/4;8h7P5h877@4}0@4 8x514I7)887F040Q0A5:6S3S2N7h3L3V680j0Z0h1#0W0G2=0s0x0I1#1n7b0W4!2z0T0K3o0i2D0R230(6;0x0,6(6*8m0(0L0M0R0J2A0(0r0T0J2Z0T0L0W0x2,1#8^0L6F3S6H1T6}6L8p0C7;1r8F7Q480z8I6R6T0T8%0T0M8-150M0T94056G3|6|6K6 7J7(0d9v8M0u1y385_0Z5E0o04.
2. Hauteur de l'arbre

Écrire la fonction hauteur qui prend en paramètre une liste représentant un arbre et renvoie sa hauteur.

Exemples
>>> hauteur(("a", []))
0
>>> hauteur(("a", [("b", []), ("c", []), ("d", [("e", [])])]))
2

###(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 : 10/10

.1280131=O0(P5tiS;lmsf+oxke/,cw[):nq23phuvréby]_dg 467Ra050Q0u0i0X0j0m0o0S0x0m0X0o0o0c010i0j0G010406050o0I0n0n0X0K0N040k0r0m0I0=0r0C0S020X0n0G0l0S0W0u0 0K0D0I0u0o050v0|0~10120`0G041q1x051A0v1A1C1x0`0Q0j0J0*0,0.0:0H0j0R0H0m1Q0H0i0^050#0M0m0u1L0-0/011P1R1T1R0i1Z1#1X0i0M0r0Q121Y0K1y0i0H0*150o0G0X0C0:0E011%1N010p0%0u0C1d0u1X2224291)2c1#2f0n2h040a0S0g0K0r0G0r0o0j181a0Z200K0K0u0x2C1q2j0C1y0v1~2O0i1|1{1}0Q2l0:1T0C2e2z1X1I1K0+1(2Y0j2!0C1^1J1X0G2H1y2M2O2_0{231a2*2a2/0K0 0m0^0b2L2}0_2|2k2 1)31330^0E3724392M2X013e0X34040F3i2N0`3l3c0:3o3q0T3t3k2}3m3z0^0h3C3v3E3x3n0r323p0^0U3J3a2~1M3d3O3f040V3C1z2@1q2(2R0Q2V3m0x1^2r0Y1J1y2?0u2^383$3/0Z3`3b3W0:0t0^0Z0p3$3w41010y0^0S473L490C0p0^0H0X170u0I0K4e402+010@040f4q3V4s0C0^100M2H4x3m4u0A0B3J0S4L4d484s43040j461r384N4f4z4B0K4D0u4F3M4u0z4%490n0j354+4s4u0O3C4W4r2a0r0^0c0c4@3U4G0^0z0O4J4U3j064M594^4y2a4Q2H0i4o0C4 4O2a4-0^0e4K4M503M4A040H5j4X4`4|5w4_1)5m045o563u595r494Q0p3O5A5c3d0^0o0r0I0o0P4C4E5G045b3m0r4b4R5i5Z5#5s4Z4#4:2a4)5:5C4.04365Z5J4;0^545p5a5,4g4j5O5$5z5+5|300M0^0 0s5?0:4u4w5{5k5Q5u6f4t0^0w655-5u4l0i4n4p6j5x1)6h6n5t5S5U5W4!5Y2{6k6g0^0A0A60624P0^5f5h6r4,5^5`2_6Q5y040q6V4Y6m5Z0`0v3}3_3%6/0v3*1q0i3,6@2T2P1@1_2R0X1!6;3*1w3 5P0:2H0n0P0p0X0t0u0P0H0F0^1i1k1m1o0S552{1D391x0d1a0G4n0i0S4l0.0j0S170%0j0o0u0K7C1a0R0L0C0L0K0X6v4o7y2c2D1$230K3/4o0j7I1#0)1I0p0p7O2e0i0)6E5V5X7m551G3=2)491+1S1U1W753m2n2e2g0^2t0k0x0K0?7x0g0N1~193$3^752`3{6.803M4Q456n5(4d6y5B3y4i6t4m4o6n6B8t763n5.6I3{6K6o044I6P691)4Q4S6(308F4$8C51044*8V3M5D6Y8H6z6L044?688I4{044}8R6A525 6+614L8N426S0!6U8,8(015D5F2_585q8I5e8~0K5*6Z8{926X8;0:8.6%908u3n6b046d8A0^6i6J915t4k8y6x9u9m8B9A8D6D5T7;6H8U9D8W6O9l8D5L5N9N3F5R9G6G5/9R3M5%0^2-9h8E047=9r8X6n8#9*0O9M951q8l6:2O733)0!0$0(04.