Aller au contenu

Arbres (1) Profondeur d'un nœud

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.

On demande d'écrire une fonction profondeur qui prend en paramètres un arbre (représenté par un tableau comme ci-dessus) et le numéro d'un nœud, et renvoie la profondeur de ce nœud.

Exemples
>>> profondeur([1, 2, 2, 2], 0)
2
>>> profondeur([1, 2, 2, 2], 1)
1
>>> profondeur([0, 0, 0, 0, 1, 3, 3, 3], 6)
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
.128013s3o_;bcdufvg/0lyàq napS!V.r1Lmeh,(P2=4:+CNtwki][5Rx)é050i0F0R0v0U0p0b0t0h0p0v0b0b0L010R0U0w010406050b0j0E0E0v0B0q040x0d0p0j0_0d0u0t020v0E0w0f0t0Y0F130B0s0j0F0b050n101214160~0w041u1B051E0n1E1G1B0~0i0U0l0.0:0=0@0G0U0m0G0p1U0G0R0|050)0g0p0F1P0;0?011T1V1X1V0R1%1)1#0R0g0d0i161$0B1C0R0G0.190b0w0v0u0@0K011+1R010k0+0F0u1h0F1#26282d1-2g1)2j0E2l040a0t0J0B0d0w0d0b0U1c1e0%240B0B0F0h2G1u2n0u1C0n222S0R201 210i2p0@1X0u2i2D1#1M1O0/1,2$0U2(0u1|1N1#0w2L1C2Q2S2}0 271e2.2e2?0B130p0|0C2P310}302o331-35370|0K3b283d2Q2#013i0v38040c3m2R0~3p3g0@3s3u0M3x3o313q3D0|0X3G1D2{1u2,2V0i2Z3q0h1|2v0$1N1C2`0F2|3c3N3W0%3(3f1Q1-0T0|0%0k3N3A3/0@0S0|0t3^3I3B3r0k0|2`0d0k1d0%0j0B3 3.2/010{040I4c323`3r0|140g2L4j3q4g0H3G3~3_4e0u0|0u4r414g0!0N3G060t4J4w404l3;040U3@1v3c4L4d344A4v3e4k4e0d0|0L0L4Y4x4W044o4q4S3n4Z4s0|0W4C4l4z044B4:2R4=4D0|0V4G4~0}4K574U4!2e4O2L0R4a4}2}593q0E0U0|0o4H57504N0|0F0,0F4_4e4g542}4I584J5q4e5c0(5f4*4M4e5k395J4V1-4$040O5O5a3h442A470u494b555E2e4g4i5%4+5W4-0B4p5v5,5K5)0|4u555i414{4.5=2 5-0@4g4^5?5P3C4X665V63520!4H1u3+3%3O6i0n3R1u0R3T6n2X2T1{1}2V0v1(6k3R1A3-6b012L0E0e0k0v0T0F0e0G0c0|1m1o1q1s0t5z3)1H3d1B0D000U1i0p0#2u0u0)2G0t0%0-5 0-0h0G0d0U2E1*0i286;0(0t0F0Z0F0B0h0U0h1*0w722u0R6-000#0h0B0U2L0t0j2(0t0b191b0U1d7m0d0j0-0:0t47366`007k1*5Z2N7q1e2F0#0B0v0_0l1*2E6$0F541K3Z2-4l1/1W1Y1!6B3q2r2i2k0|2x0P1d7n1)2y0q221d3N3$6B2~3)6h7#410m5R3?0t455Z5#0I5 0H0t0u4F6f62017 3}4K0p1d0m1r4a0t0L0t5n553z5@1-8f04570S1T7/5 0W0u0V0t0y8o0o0N4J030t8B8D6 0b7b7/0u117J0d6-0j82142i7b2I5g3c8s678e5R5C4J1e8o8N0V8c8t0@8v8.0t8i0u8k0F8m8o8}8 8m0O0t3a8r5(8u8-4K5d5f8|8j8l5$5A6g3X2S7^3Q3!6A0J7t0B8|0v240u8Q0B0j7F7r0i7B1e5 0t0r8Z0B0_9u2I490Z8M5:2L0b880l6@9u0p00707274763~9w0G2L0k0@0A0A0n5 0e0K0e3W9y2W9B2G0n4n9S1*0K9x9z9|7G1u0v9n6X040Q0d0R7R9v821a0-0m7K5!6`6S8348900B0-1s8R9w051n040G0v1bar1uay6-1*9Z5 0A0t0z9X8|9!7173751*059*9,9.9:9/0n2i0e2W0v0laB0Z9;a00e0c6LaBae4a9~5/5;0t0c0taAaC4aa7a90~6l0(0*0,04.