Aller au contenu

Arbres 3 hauteur⚓︎

Définition d'un arbre⚓︎

Un arbre est un ensemble d'éléments appelés nœuds, parmi lesquels on en distingue un appelé racine, avec une structure hiérarchique définie par une relation de parenté:

  • un nœud seul est un arbre qui a pour racine ce nœud;
  • avec un nœud \(n\) et \(k\) arbres de racines respectives \(n_1, n_2, ..., n_k\), on construit un nouvel arbre de racine \(n\) qui est le parent des nœuds \(n_1, n_2, ..., n_k\).

Chaque nœud, excepté la racine, a donc exactement un parent.

On suppose qu'il n'y a pas d'ordre sur les sous-arbres et on dit alors que l'arbre n'est pas ordonné.

Représentation d'un arbre⚓︎

Exemple du même arbre représenté de deux manières différentes. Les huits nœuds sont représentés par des cercles:
graph TB
    r(( )) --- n1(( ))
    r(( )) --- n2(( ))
    r(( )) --- n3(( ))
    n1(( )) --- n4(( ))
    n3(( )) --- n5(( ))
    n3(( )) --- n6(( ))
    n3(( )) --- n7(( ))
    r1(( )) --- n12(( ))
    r1(( )) --- n13(( ))
    r1(( )) --- n11(( ))
    n13(( )) --- n15(( ))
    n13(( )) --- n16(( ))
    n13(( )) --- n17(( ))
    n11(( )) --- n14(( ))
Les nœuds sont numérotés de 0 à 7:
graph TB
    r((0)) --- n1((1))
    r --- n2((2))
    r --- n3((3))
    n1 --- n4((4))
    n3 --- n5((5))
    n3 --- n6((6))
    n3 --- n7((7))

Implémentation⚓︎

Les \(n\) nœuds d'un arbre sont numérotés de \(0\) à \(n-1\). L'ordre de numérotation n'a aucune importance. Lorsque les nœuds ont été numérotés, l'arbre peut être implémenté par un tableau dans lequel les indices représentent les numéros des nœuds. La valeur à l'indice \(i\) représente le numéro (et l'indice) du parent du nœud \(i\). Si un élément à l'indice \(i\) vaut \(i\), cela signifie que le nœud numéro \(i\) n'a pas de parent: c'est donc la racine. La racine est donc l’unique nœud ayant une valeur égale à son indice. Par exemple, l'arbre dessiné ci-dessus est représenté par le tableau [0, 0, 0, 0, 1, 3, 3, 3].

Le même arbre peut être implémenté par des tableaux différents selon l'ordre de numérotation choisi. Les tableaux [1, 2, 2, 2], [0, 0, 0, 1] et [3, 3, 1, 3] correspondent aux numérotations choisies dans les trois représentations ci-dessous:

graph TB
    r((2)) --- n1((1))
    r --- n2((3))
    n1 --- n3((0))
    r1((0)) --- n11((1))
    r1 --- n12((2))
    n11 --- n13((3))
    r2((3)) --- n21((0))
    r2 --- n22((1))
    n22 --- n23((2))

Un chemin est une suite de nœuds telle que chaque nœud est le parent du nœud suivant. La longueur d'un chemin est le nombre d'arêtes parcourues le long du chemin.

La profondeur d'un nœud est la longueur du chemin (unique) allant de la racine jusqu'à ce nœud.

La hauteur d'un arbre est la plus grande des profondeurs.

Vocabulaire

Profondeur, niveau et hauteur

  • La profondeur ou le niveau de la racine est 0.

  • La plus grande profondeur ou le plus grand niveau d'une feuille est 3.

  • La hauteur de la racine est 3.

  • La hauteur d'une feuille peut être 0, 1 ou 2.

  • La hauteur de l'arbre est 3. C'est à la fois:

    • la plus grande profondeur

    • le plus grand niveau

    • la plus grande hauteur

    • la hauteur de la racine

Afin d'obtenir la hauteur, on choisit de calculer la plus grande profondeur.

Il est demandé de compléter la fonction profondeurs qui prend en paramètre un arbre et renvoie un dictionnaire dont les clés sont les numéros des nœuds, la valeur associée à chaque nœud étant sa profondeur.

Un algorithme qui calculerait la profondeur de chaque nœud, l'un après l'autre, ne serait pas efficace. Si lors du parcours d'un chemin, on rencontre \(k\) nœuds, on peut obtenir la profondeur de chacun des \(k\) nœuds en un seul passage. Pour cela, on mémoïse les résultats dans un dictionnaire.

Compléter ensuite la fonction hauteur qui prend en paramètre un arbre et renvoie la hauteur de l'arbre. Cette fonction utilise la fonction profondeurs puis une recherche de maximum.

Exemples
🐍 Console Python
>>> profondeurs([1, 2, 2, 2])
{0: 2, 1: 1, 2: 0, 3: 1}
>>> hauteur([1, 2, 2, 2])
2
>>> profondeurs([1, 1])
{0: 1, 1: 0}
>>> hauteur([1, 1])
1
>>> hauteur([0, 0, 0, 0, 1, 3, 3, 3])
3
###(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
.339.128013s3_8ufvy n7aS1me(P2C4:jtwi]D[h)6Oo;bcdg/0làqp!.r-,}=+k{95Rxé050N0r0z0n0B0R0c0k0M0R0n0c0c0#010z0B0U010406050c0g0q0q0n0X0j040o0J0R0g110J0l0k020n0q0U0K0k0+0r1b0X0T0g0r0c050P181a1c1e160U041C1J051M0P1M1O1J160N0B0i0_0{0}0 0F0B0O0F0R1$0F0z14050;0L0R0r1X0|0~011#1%1)1%0z1/1;1-0z0L0J0N1e1.0X1K0z0F0_1h0c0U0n0l0 0u011?1Z010h0?0r0l1p0r1-2e2g2l1^2o1;2r0q2t040b0k0t0X0J0U0J0c0B1k1m0/2c0X0X0r0M2O1C2v0l1K0P2a2!0z2827290N2x0 1)0l2q2L1-1U1W0`1@2.0B2:0l241V1-0U2T1K2Y2!35172f1m2_2m2~0X1b0R140k0p2X3915382w3b1^3d3f3h0u3k2g3m2Y2-013r0n3g040k0d3v2Z163y3p0 3B3D0k0w3H3x393z3N3h0*3R3J3T3L3A0J3e3C3h0H3Y3n3a1Y3q3%3s3E0m3,3K3/3M3;3)3E0f3^3!3`3$3(3O0)403o423V040p0Q473.2`433=0p3j1D3l3Z484g4a0p3u4l3w4n4f3c3|3D0p3G4t3I3-3U4y140p3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4$414(4U0p464,4M3:4U0u4d4=4w4@3=0u4k354S4Z4)0u4s514Y49544B574%4N4~4J5c4-5e3}0u4Q5h4?3{4^4W371P331C2@2%0N2+3z0M242D0.1V1K320r343l3R055B0/5J5o010%140/0h5L5d1^0A3h5W5i3q0h14320J0h1l0/0g0X1B4K584g13040s5#5Q0l141c0L2T5{4|0 5^0G0x3Y0k690k5?3c142C0q0J3R6b5X0 0J140#6i6c1^5^0(0!686a6q0 5S045,0X6p6k3A140l6D5$6l5Z042|6I5|0L140X2g0O0r623z5^5`5=6E0l6Q042A6W3#6Y6*495~0X606V6!6J0165666v6a6w6E6z0B5V4K6j6@5}046H726x010J6L2~0z6O637a6L6N786#6e1v6h6?5Q5^674R6|7u6}7414602g0M0F6=35735Q6m046o7k6@5^0E6-4p6G7O2m5^0C6{7v7w5|142q0h2g7e7K7G6n7f3U7Q7t7W6|79752f2T0l7%7E797H7J7`7l045 617p7g7M7R3q7Z0l7#7^8664147U7.7/69796z0A1#1;7+4Z5)1c2q7_3l7F7g7H0V7}8u7;888a8t3w8v3z7b5~0l0N8o6.047?8s8M4g8I760J8E2Z8G3#8T7j7~7x046f7o376E7r7V8h7X7g757z0l7B7D5K6E7H0W8c6F800U0U2q8L836X146Z8+8%8P8b956+140G8.8/8Y8N7!7$8R2m7|9n878O8r9c519i7u8B9s7@8W3E7{7*7(8;6/6;8~859d9k899m9L5@8e9h7v8j14709q3M8q9A9X7a6n8z8F9y9l9u8`7L147s7E9j4g0M0p14030_001A0z0k0{0k6S0M2|8_4u9w7:6~146B9#750B9#8!778$6P6R6Ta52Z796,9P3c6%6)aq6r978~8=6S8@7C9J9f6`8ga7a88%8)aC047Nau9Y048?8^aKaM997Y6MaK0C8fai8w9Ea!3Uas2qaK989-aVaQaBaN6^9faf140Y9#0q0B4Ha@04a_9F7,aWaF7/9U040r0@am5P849/9S8hb6abb18pb3a%8Z7iah8A6#6%az6Ua+axa)bo3waoawa;ay7Aa:aUbc040GaE9vaG9x7 aJa;9KbFb2a/babzaLax9VaXaZbp6@9pbi49bwbubB7yazaRbPa?b(8S140$ac7m6gaSbX9z8Qb:04b!9)8{a^b_bk4maH5Q6z2T0z5/bx8X9ybO5152426z5U8~6L6bbB5(040F0n1j0r5/b+bRbj81bU8,9f9:c88:b21U0M0e5*5,8Kcx5:a~9(cg7 cN5-cQ5;cA42apc!7P806:82c%7Sb;bK8icV2IcO5.0X0e1b0,cSa`a|044`c/9=2m6zbhbl8NcWcPcyb=9obnc6cKcMc=cX5/cZa-a#048}b,040i3C1zdkbycE5_bJcH9Ta96M71d6c(d8c@a~020O0z0Kc6dGcQc_0nc{c0cGa69i9ydO5/dQdSdE9oa$b#aVdY6CaFb6cccedNdhd9c^c`3,0P5N5I1L5u0P5w1C0z5ye12)2#23252%0n1:d|d 5F1Ibb3z2T0q0e7#0%0r0e0F0d141u1w1y1A0kdUan1P3m1J0t0J5/0_3C0M0g1;0X9 0n0kd+0k0N000g1m0l0a0g0N0Z0k1leN1c5B5/9~eS0_7Ca{1m3C0{7^eP1=a0a2a40k0y0g0c1y000S0_1=eUeW0W060o0BeZ3aeGeI0=e)2:e#eKeSe?eMeO2Q7B0neu0kf3eXeL9 1l0O1zeE0z8V3C1=7?e%0X1z0k0c0r6S2N06a0051v6(fvfxeKfme,a42Ce;0r0,0zfJ2:1CfPeN0X0-fI7^0-1=0N2g0^0R9|0,fJa30M1=05eM0F2T0h0 0W0W0Pg40PfZf`0Bf|0c0PcC0e8^e-1v8s0e0p0P140vfV2:fX9~f;0l0^e*cC3i1C0ndn1LeA040I1mei1cfpfp2KeEe*fr0keu0R5B0leueYa00c0J1af:1=0cf cvf#eE0:e=fHfkd=c@0k9}ftcucweE2Qf@cC0W0k0D1l0MeY2Mf92c0l2r2Ng@g)cQd21^1c2N0F1bf#0,14090s0F099g72eQgOeV2,g,g%f*5+dieK79hf2ahifZhl0s0Uhp3ReY3C3%f?g(g_fTe?00gyg?hC0XhghFhk04hm0F0$hJhq35g~0560150v0:f#hy320B0-0z0-eNfJ2Cgt000J0Lf#0l0BeK2M1q1;gs9 f:gb2Oh82Te=0^g^g*5:iifqhu0^f07?11fT0gePie0B1ligg#0^d+0^0/0^fr0^g,g{hQilg-g|c*0rdo1S5v0:0=0@04.