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

.128013witkcvN8o-)yl0bqpx_.P3(a+g=/m4rse97Sf,d 612:5nuh050N0H0d0y0c0n0G0O0f0n0y0G0G0B010d0c0r010406050G0V0D0D0y0F0m040K0j0n0V0;0j0U050C0{0}0 110_0r04051h1a1k0C1h0_0N0c0g0)0+0-0/0+0U0A0V0y0A0H0k0r0m0d0W180O0W0c0A0W0n1M0W0d0@050!0p0n0H1t0,0.011L1N1P1N0d1V1X1T0d0F1i1H0)140G0r0y0U0/0R011Z1v010L0$0H0U0y0D0H1T1^1`1 1#221X25270@0a0O0v0F0j0r0j0G0c170U0O0Y1?0F0F0H0f2s1a2a0U1i0C1H2F1/1;1:1U0N2c1w0c0U242p1T1q1s0*1!2P2R0U0j2V1T0r2y1i2D2F2,0`1_2t2X202#0F0~0n1T0y1K2y0L0/030t0t0f2$0H1P2!0j0k0w0k0Q0@0O0Q1a0y2-2:0^2/2b2=1#2@2_2{2}0H2 01313335372S3a0k1}040O0R3h3j1`3l2D2O013q0y2`1i2|0W2~3032340Y3A2#3C0w3e0w3I2C3k0_3M3o0/3P3R053T3V3w3X3z2Q3B3b0E3e0E3*1b3,3m2;1u3p0j2^3Q3s3U3u3W3y3Z3|3#3b0T3e0T422,3-2:3N3;4c3^3x3Y364i393b0P3e0P4o443.473:493r3S3t3v4w3{383C0J3e0J4F3K4q3n4I3O4K4b4M4d4O3`4h4R3b0i3e0i4W2E4Y462Y4#4a3=3@4e3_4g4y4-0k0I3e0I4=3L4r3/4`4L3?4N4f4x3!4A3c0o0@0Q0o574@4s4$4|5e4 5g4z3C0Q3d045y5o455q4{4u4~4P4,3}3c3E0Q3H0C3i3+4X5D5a4t4(4v4+515K0Q3%5A3)5P3J4?5T4!5V5d4)5f4Q5!3 5A415)5R5+4H4_5.4}4*505h5x4l5A4n5`435S5}2?5r5G615v520Q4C5A4E682.1n2*1a2V2I0N1;2N5a4x2U1r1i2)0H2+3k5{1i4x6D2b0c0N0/322D5x3s6K6M625w3b3d0O2g0H6S6g5!1T5`6b1#0e0@3o6F5,4_0b3e6.6)3:0f0@0h0j0H0V0N6?594!0?040S6F0_692E5D6R016N2:3C3E5d7b5Y633b1}6X266Z7c6T527g5)0O7v0O6/206+040Y0L704Z6:6=786I4^200L0D0@322Q2r327E7K1#730x7T3N0p730G367D7I7y7V0@0M6F7x6@3O0@0Z0c0q0V0Z0d0H7Y5a737-7I7/715~0@0A0y0V0f0W7|7)7:7 7.7*3:0@0N2m2r7}720@0l757I772.3M7i0t6O3b5$7h6L7q6#4j3a1~6Y6!5=8E8z7u7w8N8g017!0@7$0n7(8t83200j0@0u8m84040g8f7:8Z040B8*8X3p7=0;7^7`8b4p7Y8v8x0k5@8A8I5J8E3 7n27915Z936%3i8N8O7:8R048T8V6E8+8!8$2?8587898_3k827F8Y0@8.818P0U9o888a768{8B7d1`3C65908C8J5i4l957p7j6U0k9K8M9c9t7U0/9f9h9m1#8,8#8c8:8h7B8k0d8/9u9(9w9;9Z7;9.0j8l8r9F6S8}6j9L9S524C9Q977k0ka25)8s9j4r8|7e3b4T4M8v8D5i4Ta79M92an9a3l9+6J9G8wah0k4/akaxam3C4/apa45KaB3*7:7A7C9%0/6;3FaP3O0L0@0!0$1XaT7WaT9A040ya!8o8q8`av2tag9I3b54aCa89T54aH7r5Ka?3I9d9,017A0c9i3K9Y4s0@a)9y8+aR0c0G9^3N0e6_046{2Ra*749Ea.0Oa:0U5x5ka@aq985i5m8G7oa^6hbva 9Xb75a7A2y0d0V0F19bbb10D0c0@5n9~bqbs5x5za3a|8E5ybB96bxa9b(2F9b7w8PbK0ZbNbP2,bI4!bS5lbg5a8,0zb~5-aW0#0naZbq7~0@7Xc8c3a(aT9)a$9B9qbn0lc24_c0cm9n04aXc69r3K8Pa#cc8%ba8W9=0/cgcycq8j9|9:cF7+04clbWcBa/ax8}5N6QaD9N5x7m8Hb+9TcTb.aucPbrcRaz5#cUbD5!3%a{aE6V8L5QaM8i3uaTaR7xcK3:aV040W877{bNbncbc)5Ub9cka,44bXc+a;3c8 2|alcW6V94cZaIb%8 9Wb`4_b3b52EdvcqcA9s8P0jbdbfbQcCb2bjblcu798d0@de5Sdga0c,9KdlcVar64b)9Rb$bz9Vb/9Xb;0@bLb@cp9?040kaTb|5Abpc)bY6Va2dXc/b%a6dqd%5xabd*dA6*d-b?bOd:0/d^3gdI9_coeh4s0p0@0~0sd8chd3d56}0Feqd09`dCcv9k049*dacd869CdN7J3N730l80b_9z0@d416eueweEczcf9lexa%cH9}eV20eLcNa-6n6H1l6p0C6r1a0d6te=2L2G0y1W6C6q6z770Ycs0G04.