Taille et hauteur d'un arbre (2)

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 une liste contenant la valeur portée par la racine suivie des sous-arbres. Une feuille est donc représentée par une liste d'un unique élément [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

.128013s3o_;bcdufvg/0lyàq napS.r1Lmeh,(P2=4:+Ctwki][5R)é050i0D0O0v0R0p0b0t0h0p0v0b0b0J010O0R0w010406050b0j0C0C0v0z0q040x0d0p0j0=0d0u0t020v0C0w0f0t0V0D0 0z0s0j0D0b050n0|0~10120`0w041q1x051A0n1A1C1x0`0i0R0l0*0,0.0:0E0R0m0E0p1Q0E0O0^050#0g0p0D1L0-0/011P1R1T1R0O1Z1#1X0O0g0d0i121Y0z1y0O0E0*150b0w0v0u0:0I011%1N010k0%0D0u1d0D1X2224291)2c1#2f0C2h040a0t0H0z0d0w0d0b0R181a0Z200z0z0D0h2C1q2j0u1y0n1~2O0O1|1{1}0i2l0:1T0u2e2z1X1I1K0+1(2Y0R2!0u1^1J1X0w2H1y2M2O2_0{231a2*2a2/0z0 0p0^0A2L2}0_2|2k2 1)31330^0I3724392M2X013e0v34040c3i2N0`3l3c0:3o3q0K3t3k2}3m3z0^0U3C1z2@1q2(2R0i2V3m0h1^2r0Y1J1y2?0D2^383J3S0Z3!3b1M1)0Q0^0Z0k3J3w3+0:0P0^0t3;3E3x3n0k0^0#0%1#3{3*2+010@040G442~3?3n0^100g2H4b3m480W0L3C060t4q3`3=460u403C4s3|4d0d0^0J4x3a4c460C0R354o4r4y452a3-040k0d0z4E4t300^0R4V4z460d3^042-4!4O3d0g0^0z240m0D4j3}484a1r3#4W1)4I4K4{3j4F4k0^0F4+4G304.042o4@4d4_5d4u4f0z4h4?512N534^0^0W4m4L4M4r5o4d4v040O573m4B044D5m044N583d4w5G5I5C0^0M5B3}5y410p435G5w465f5X4}3y5i5k5g2a480T5*5K4)5.0:480S0W5t4q5Y4P4/0!0j0z0u5R5x5L2_0`0n3%3Z3K690n3N1q0O3P6e2T2P1@1_2R0v1!6b3N1w3)5J0:2H0C0e0k0v0Q0D0e0E0c0^1i1k1m1o0t4n5X1D391x0B0v0t4S0u2J0R193`683m1+1S1U1W6s3F5a1s3J673T5H2E0H0q1~6X0w0D320!0t0i003p0p0X4=0z0t1#202E6L1G3V2)4d6#1-1V2i4#2a2n2e2g0^2t0x0h0z0?0O2u6?0E193J3Y6s2`3#686)3}4Q3/5;014(3`5#7i3d3 5z0$5V5l2{5$470^4`7U7N5%044g4i7M4,5=5q6L654M5{3,5}0O5 615M7:0:4 04367_7V5D5Q7 7!3n6+0}7I5!7Z7*4e7Q427T4|84898g8b5y7%8f527V5,7I5y4Z7)6t7W045@62464Q4S4U838k4Y8z2a4%4Y7^2_5N5S5a4:0u4=887X7I7|7~8a8v48568E8v0u5a5c8u54498r5(7(8Y8,5r5^5G667D6a2O6q1B040N0!0O1$0v0w2?0d0h0E1$1o7t0v0j0.0R0t0l3p0R2E0i240)760h0-6}6 5j2H0)0z0X0i0j2B0)0r0t0j2!0t4:0h2-1$9q74056Z3}7e6%7h8k860C8T490T8y6M7D0t9b0t0X9i160X0t9D9O3T6!1U7f6(7`017|0o6-7D0y1z396c0!7R0b04.
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

.128013s3Oo_;bcdufvg/0lyq n7apSr1meh,(P2=4:+twki][5Rx)é6050j0C0M0w0P0q0b0t0i0q0w0b0b0I010M0P0x010406050b0k0B0B0w0z0r040y0e0q0k0=0e0u0t020w0B0x0g0t0T0C0 0z0s0k0C0b050o0|0~10120`0x041q1x051A0o1A1C1x0`0j0P0m0*0,0.0:0D0P0n0D0q1Q0D0M0^050#0h0q0C1L0-0/011P1R1T1R0M1Z1#1X0M0h0e0j121Y0z1y0M0D0*150b0x0w0u0:0H011%1N010l0%0C0u1d0C1X2224291)2c1#2f0B2h040a0t0G0z0e0x0e0b0P181a0Z200z0z0C0i2C1q2j0u1y0o1~2O0M1|1{1}0j2l0:1T0u2e2z1X1I1K0+1(2Y0P2!0u1^1J1X0x2H1y2M2O2_0{231a2*2a2/0z0 0q0^0A2L2}0_2|2k2 1)31330^0H3724392M2X013e0w34040c3i2N0`3l3c0:3o3q0J3t3k2}3m3z0^0S3C3v3E3x3n0e323p0^0X3J3a2~1M3d3O3f040v3C1z2@1q2(2R0j2V3m0i1^2r0Y1J1y2?0C2^383$3/0Z3`3b3W0:0O0^0Z0l3$3w41010N0^0t473L490u0l0^0D0w170C0k0z4e402+010@040F4q3V4s0u0^100h2H4x3m4u0V0K3J0t4L4d484s43040P461r384N4f4z0h0^2o4F3M4u4w4U3j3U3F4B0z4D0C4$494H3C4W4r2a0e0^0I0I4^4,3M0B0P354=4s4u4J4*3u4M5c4_4y2a4Q2H0M4o0u504O2a530^0p4K4M514g4j5m4X4{4}5x4`1)5p045r5a0_5c5u4P0^0l3O5B5f3d0^0P5P3m0e4b4R5l5H5e3F4Z040z240n4;5H5K2a4(565o5404365-5n1)4u0E5U3M0u5%4#5_5y5{0^4)2{5`3y4.4:5;65040V4I5s5d5#5 5w5!5.1)4|044 6n693n5%0 0U6d0:5:635C6a040D6z4t0^5}6t646E4k4m4o6H6B686M3n6b4E6C5Q6A0^0R6H4A4R6R0^0Q6g6i6k495h0!5k5~495E5^2_6/4s6q0L6@4z6m2_0`0o3}3_3%770o3*1q0M3,7c2T2P1@1_2R0w1!793*1w3 6Z012H0B0f0l0w0O0C0f0D0c0^1i1k1m1o0t592{1D391x0d1a0x4n0M0t4l0.0P0t170%0P0b0C0z7X1a0n0W0u0W5)0M4n7%0w2c2D1$230z3/4o0P7%1#0)1I0l0l7-2e0M0)0b0e0k0b0f4C2H0)591G3=2)491+1S1U1W7q3m2n2e2g0^2t0y0i0z0?7S0G0r1~193$3^7q2`3{768p3M4Q456H5X4d6Y3F4i6F4l7/6Q8S4%666%6W5,6T6D6I6f7J38065J6u4Q4S7030612e6*4v8$048d8(3{6u4@6L8*6q4~8@5D5?6`916U586.8:6U6;5j0z5Z6{6o0:5E5G739g8*9i6?947r6_980:6~9z6v0^6x8{679c8*6(6O8X4p8Z4?8#9O718~4/6X8)7r4u6$9R305S8{6,9C4Q5N9N9m6u6(5T9w5V5X2-9C600^5)0u5+9G6H9y9!6e6K9-6U9_04629W4G9Qa96l9T6ca16!6f6-5H748K782O7o3)0!0$0(04.