Taille et hauteur récursive d'un arbre binaire

Un arbre binaire est soit vide, représenté en Python par la valeur None, soit un nœud, contenant une étiquette et deux sous-arbres gauche et droit et représenté par une instance de la classe Noeud donnée ci-dessous.

Python
class Noeud:
    def __init__(self, etiquette, gauche, droit):
        self.v = etiquette
        self.gauche = gauche
        self.droit = droit

graphe 2024 41.1

L’arbre ci-dessus sera donc implémenté de la manière suivante :

Python
a = Noeud(1, Noeud(4, None, None), Noeud(0, None, Noeud(7, None, None)))

Écrire une fonction récursive taille prenant en paramètre un arbre a et qui renvoie la taille de l’arbre que cette instance implémente.

Écrire de même une fonction récursive hauteur prenant en paramètre un arbre a et qui renvoie la hauteur de l’arbre que cette instance implémente.

On considère que la hauteur d’un arbre vide est -1 et la taille d’un arbre vide est 0.

Exemples

Python Console Session
>>> hauteur(a)
2
>>> taille(a)
4
>>> hauteur(None)
-1
>>> taille(None)
0
>>> hauteur(Noeud(1, None, None))
0
>>> taille(Noeud(1, None, None))
1
Compléter le code ci-dessous

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

.1280136ra37 =Npcg+vu5l:tShf0(x/ms1_iq2n8owke)y4d.9P,b-050Q0M0s0d0E0q0B0g0k0q0d0B0B0h010s0E0j010406050B0o0A0A0d0c0O040t0J0q0o0;0J0H050z0{0}0 110_0j04051h1a1k0z1h0_0Q0E0n0)0+0-0/0+0H0l0o0d0l0M0W0j0O0s0u180g0u0E0l0u0q1M0u0s0@050!0V0q0M1t0,0.011L1N1P1N0s1V1X1T0s0c1i1H0)140B0j0d0H0/0G011Z1v010v0$0M0H0d0A0M1T1^1`1 1#221X25270@0a0g0T0c0J0j0J0B0E170H0g0Y1?0c0c0M0k2s1a2a0H1i0z1H2F1/1;1:1U0Q2c1w0E0H242p1T1q1s0*1!2P2R0H0J2V1T0j2y1i2D2F2,0`1_2t2X202#0c0~0q1T0d1K2y0v0/030D0D0k2$0M1P2!0J0W0e0W0C0@0g0C1a0d2-2:0^2/2b2=1#2@2_2{2}0M2 01313335372S3a0W1}040g0G3h3j1`3l2D2O013q0d2`1i2|0u2~3032340Y3A2#3C0e3e0e3I2C3k0_3M3o0/3P3R053T3V3w3X3z2Q3B3b0P3e0P3*1b3,3m2;1u3p0J2^3Q3s3U3u3W3y3Z3|3#3b0p3e0p422,3-2:3N3;4c3^3x3Y364i393b0b3e0b4o443.473:493r3S3t3v4w3{383C0f3e0f4F3K4q3n4I3O4K4b4M4d4O3`4h4R3b0I3e0I4W2E4Y462Y4#4a3=3@4e3_4g4y4-0W0S3e0S4=3L4r3/4`4L3?4N4f4x3!4A3c0w0@0C0w574@4s4$4|5e4 5g4z3C0C3d045y5o455q4{4u4~4P4,3}3c3E0C3H0z3i3+4X5D5a4t4(4v4+515K0C3%5A3)5P3J4?5T4!5V5d4)5f4Q5!3 5A415)5R5+4H4_5.4}4*505h5x4l5A4n5`435S5}2?5r5G615v520C4C5A4E682.1n2*1a2V2I0Q1;2N5a4x2U1r1i2)0M2+3k5{1i4x6D2b0E0Q0/322D5x3s6K6M625w3b3d0g2g0M6S6g5!1T5`6b1#0L0@3o6F5,4_0K3e6.6)3:0k0@0i0J0M0o0Q6?594!0?040r6F0_692E5D6R016N2:3C3E5d7b5Y633b1}6X266Z7c6T527g5)0g7v0g6/206+040Y0v704Z6:6=786I4^200v0A0@322Q2r327E7K1#730x7T3N0V730B367D7I7y7V0@0U6F7x6@3O0@0Z0E0F0o0Z0s0M7Y5a737-7I7/715~0@0l0d0o0k0u7|7)7:7 7.7*3:0@0Q2m2r7}720@0N757I772.3M7i0D6O3b5$7h6L7q6#4j3a1~6Y6!5=8E8z7u7w8N8g017!0@7$0q7(8t83200J0@0R8m84040n8f7:8Z040h8*8X3p7=0;7^7`8b4p7Y8v8x0W5@8A8I5J8E3 7n27915Z936%3i8N8O7:8R048T8V6E8+8!8$2?8587898_3k827F8Y0@8.818P0H9o888a768{8B7d1`3C65908C8J5i4l957p7j6U0W9K8M9c9t7U0/9f9h9m1#8,8#8c8:8h7B8k0s8/9u9(9w9;9Z7;9.0J8l8r9F6S8}6j9L9S524C9Q977k0Wa25)8s9j4r8|7e3b4T4M8v8D5i4Ta79M92an9a3l9+6J9G8wah0W4/akaxam3C4/apa45KaB3*7:7A7C9%0/6;3FaP3O0v0@0!0$1XaT7WaT9A040da!8o8q8`av2tag9I3b54aCa89T54aH7r5Ka?3I9d9,017A0E9i3K9Y4s0@a)9y8+aR0E0B9^3N0L6_046{2Ra*749Ea.0ga:0H5x5ka@aq985i5m8G7oa^6hbva 9Xb75a7A2y0s0o0c19bbb10A0E0@5n9~bqbs5x5za3a|8E5ybB96bxa9b(2F9b7w8PbK0ZbNbP2,bI4!bS5lbg5a8,0mb~5-aW0#0qaZbq7~0@7Xc8c3a(aT9)a$9B9qbn0Nc24_c0cm9n04aXc69r3K8Pa#cc8%ba8W9=0/cgcycq8j9|9:cF7+04clbWcBa/ax8}5N6QaD9N5x7m8Hb+9TcTb.aucPbrcRaz5#cUbD5!3%a{aE6V8L5QaM8i3uaTaR7xcK3:aV040u877{bNbncbc)5Ub9cka,44bXc+a;3c8 2|alcW6V94cZaIb%8 9Wb`4_b3b52EdvcqcA9s8P0JbdbfbQcCb2bjblcu798d0@de5Sdga0c,9KdlcVar64b)9Rb$bz9Vb/9Xb;0@bLb@cp9?040WaTb|5Abpc)bY6Va2dXc/b%a6dqd%5xabd*dA6*d-b?bOd:0/d^3gdI9_coeh4s0V0@0~0yd8chd3d56}0ceqd09`dCcv9k049*dacd869CdN7J3N730N80b_9z0@d416eueweEczcf9lexa%cH9}eV20eLcNa-6n6H1l6p0z6r1a0s6te=2L2G0d1W6C6q6z770Ycs0B04.