Aller au contenu

Arbres (2) Construction

Construction d'un arbre⚓︎

On dispose de deux arbres, (une forêt), et on souhaite construire un nouvel arbre avec un nœud racine et les deux arbres donnés comme sous-arbres de la racine.

Exemple avec deux arbres et le nouvel arbre obtenu:
graph TB
    r2(( )) --- n21(( ))
    r2 --- n22(( ))
    r2 --- n23(( ))
    r1(( )) --- n11(( ))
    r1 --- n12(( ))
    n12 --- n13(( ))
    n12 --- n14(( ))    
    r3(( )) --- n32(( ))
    r3 --- n31(( ))
    n32 --- n331(( ))
    n32 --- n332(( ))
    n32 --- n333(( ))
    n31 --- n311(( ))
    n31 --- n312(( ))
    n312 --- n313(( ))
    n312 --- n314(( ))

Les \(n\) nœuds d'un arbre sont numérotés de \(0\) à \(n-1\) dans n'importe quel ordre.

Les nœuds sont numérotés:
graph TB
    r2((3)) --- n21((0))
    r2 --- n22((1))
    r2 --- n23((2))
    r1((1)) --- n11((0))
    r1 --- n12((2))
    n12 --- n13((3))
    n12 --- n14((4))    
    r3((9)) --- n32((3))
    r3 --- n31((5))
    n32 --- n331((0))
    n32 --- n332((1))
    n32 --- n333((2))
    n31 --- n311((4))
    n31 --- n312((6))
    n312 --- n313((7))
    n312 --- n314((8))

Implémentation⚓︎

Un arbre est représenté 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.

Les trois arbres représentés ci-dessus sont implémentés par les tableaux: [3, 3, 3, 3], [1, 1, 1, 2, 2], [3, 3, 3, 9, 5, 9, 5, 6, 6, 9]. Pour construire un nouvel arbre à partir de deux arbres, si on suppose les nœuds du premier arbre numérotés de \(0\) à \(n-1\) et les nœuds du deuxième arbre numérotés de \(0\) à \(m-1\):

  1. On crée un tableau de longueur \(n+m+1\), par exemple [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  2. On conserve les numéros des nœuds du premier arbre (de \(0\) à \(n-1\)), soit [3, 3, 3, 3, 0, 0, 0, 0, 0, 0];
  3. Le nœud racine du premier arbre a pour racine le nœud numéro \(n+m\), soit [3, 3, 3, 9, 0, 0, 0, 0, 0, 0];
  4. On décale les numéros des nœuds du deuxième arbre (de \(n\) à \(n+m-1\)), soit [3, 3, 3, 9, 5, 5, 5, 6, 6, 0];
  5. Le nœud racine du deuxième arbre a pour racine le nœud numéro \(n+m\), soit [3, 3, 3, 9, 5, 9, 5, 6, 6, 0];
  6. La racine du nouvel arbre reçoit le numéro \(n+m\), soit [3, 3, 3, 9, 5, 9, 5, 6, 6, 9].

On demande d'écrire une fonction construction qui prend en paramètres deux arbres, et renvoie l'arbre construit en suivant le procédé décrit ci-dessus.

Exemples
>>> construction([3, 3, 3, 3], [1, 1, 1, 2, 2])
[3, 3, 3, 9, 5, 9, 5, 6, 6, 9]
>>> construction([2, 2, 2], [2, 2, 3, 3, 3])
[2, 2, 8, 5, 5, 6, 8, 6, 8]
###(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
.128013buS[,34l(wn/8p)aPk0:hors1*v7c256mgyd]i9eft =+050K0O0Q0q0M0i0y0R0D0i0q0y0y0S010Q0M0o010406050y0c0H0H0q0x0J040d0w0i0c0.0w0l050m0^0`0|0~0?0o04171e051h0m1h1j1e0?0K0M0B0$0(0*0,0v0M0I0v0i1x0v0Q0;050X0b0i0O1s0)0+011w1y1A1y0Q1G1I1E0Q0b0w0K0~1F0x1f0Q0v0$110y0o0q0l0,0E011K1u010P0Z0O0l0q0H0O1E1,1.1?1M1_1I1|1~0;0a0R0r0x0w0o0w0y0M140l0R0V1*0x0x0O0D2j17210l1f0m1(2w0Q1$1#1%0K230,1A0l1{2g1E1p1r0%1L2G0M2I0l1Y1q1E0o2p1f2u2w2!0@1-2k2O1@2T0x0{0i0;0R0z2t2(0=2%222*1M2,2.2:0E2?1.2^2u2F012}0q2/040R0g312v0?342{0,37390R0h3d332(353j2:0F3n3f3p3h360w2-382:0G3u2_2)1t2|3z2~3a0C3E3g3H3i3J3B3a0n3N3w3P3y3A3k0N3V2`3X3r040z0t3$3G2P3Y3K0z2=182@3v3%3/3)0z303@323_3.2+3R390z3c3 3e3F3q440;0z3m483o3`433Z4d3t4g414b4k3*3D4g1g2Y172M2z0K2D350D1Y1 1f4x1i4v2$4t4C0V2Z3W3/0s0;0V0P3n4a3x0k2:4U3O3{0P0;4C0l0y2A0c2r0M154Z4O1@0:040j4:4i2|0;0|0b2p3?2$4!4=0;0f3n0R4V3(4|0x4~0O3~514;1M4?0p0u3u0R5m57524{04164g5o5g0,0w0;0S56583{0b0;264_425h0;4^4t5p3i5a5c502@5B53040p5l5n5S5q0H5A5M015x045z5t5Y3i5D045F5L5v014?5K5f4`5N044}2p5e5R5$5i5W5m5,365O2p5#5=5(5*2!5u5`5?0;0e5G350H0M0;3,5;6f4?0L696f5(0A6t5H0,5@6j3x0l0;5s6d655(0T6x3q0;5!5+5$6I6K3x6l4d6B3X624n5n6e6y014Q040P3z6R59040M6+3/0w4X6-6F2@6!3q5.0x1.0I0O6V3/6A6p6#6D5r705T5j636Z6_3x6%0M4T6O5=755}0O5Q32654?6i736L6-775I046s7h6u5y6c6^65756.7r3x4?5k6Y7b7L7D676 7G6W6h7u5{7F5_6#6r6/1@6b7Z5q6@327c3X6Q7y746M7a6Z656%0O0!7P7W357I7:7L7*3{7O7T6g047q7`6C0;7V605=7Y7-357#8d875|5b4 827p827E8l0;7x2!067;5$6%6)0x7$7U8z5%6=2R8B0l6{6}7_8a6q5J8n7/7Q710;797K7M8v887g6G5$7j8j5d8p848N7t8P5T8r7C6P7A8F888%7J8s7~7b7N8i5c8%858K7.8*8Y6a0;6J8g6,7(2v7o8q8B8f936f75993a6H958;046N8^7~7=0;7@0y8J7n610;8@3^8_8u7i818+7v8 9w9D928.9404969f919i9b7w9d5y9m7k5 9I8L8(9F8A9$838-7)9k9N9m9i8t5X8Z9E867R9#9@8076976:9l9}2+8O9`8,9U5)9.a59O9L9ga29A9;5=6%2p0Q0c0x9i7 a18|684n174L0O2w2Xat4w1q4y2z2B2x1X1Z2z0q1Haw0m4x0?aJ0W0Y0!04.