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
.128013:pbv(40i2+edm3s7= 1o5wlSnatf)9h]6,crg*[yPku8/050m0l0B0A0i0x0p0s0J0x0A0p0p0r010B0i0c010406050p0R0n0n0A0K0O040y0u0x0R0.0u0z050T0^0`0|0~0?0c04171e051h0T1h1j1e0?0m0i0e0$0(0*0,0F0i0L0F0x1x0F0B0;050X0d0x0l1s0)0+011w1y1A1y0B1G1I1E0B0d0u0m0~1F0K1f0B0F0$110p0c0A0z0,0j011K1u010C0Z0l0z0A0n0l1E1,1.1?1M1_1I1|1~0;0a0s0P0K0u0c0u0p0i140z0s0V1*0K0K0l0J2j17210z1f0T1(2w0B1$1#1%0m230,1A0z1{2g1E1p1r0%1L2G0i2I0z1Y1q1E0c2p1f2u2w2!0@1-2k2O1@2T0K0{0x0;0s0t2t2(0=2%222*1M2,2.2:0j2?1.2^2u2F012}0A2/040s0o312v0?342{0,37390s0g3d332(353j2:0v3n3f3p3h360u2-382:0H3u2_2)1t2|3z2~3a0q3E3g3H3i3J3B3a0S3N3w3P3y3A3k0E3V2`3X3r040t0h3$3G2P3Y3K0t2=182@3v3%3/3)0t303@323_3.2+3R390t3c3 3e3F3q440;0t3m483o3`433Z4d3t4g414b4k3*3D4g1g2Y172M2z0m2D350J1Y1 1f4x1i4v2$4t4C0V2Z3W3/0Q0;0V0C3n4a3x0w2:4U3O3{0C0;4C0z0p2A0R2r0i154Z4O1@0:040f4:4i2|0;0|0d2p3?2$4!4=0;0I3n0s4V3(4|0K4~0l3~514;1M4?0D0b3u0s5m57524{04164g5o5g0,0u0;0r56583{0d0;264_425h0;4^4t5p3i5a5c502@5B53040D5l5n5S5q0n5A5M015x045z5t5Y3i5D045F5L5v014?5K5f4`5N044}2p5e5R5$5i5W5m5,365O2p5#5=5(5*2!5u5`5?0;0N5G350n0i0;3,5;6f4?0G696f5(0M6t5H0,5@6j3x0z0;5s6d655(0k6x3q0;5!5+5$6I6K3x6l4d6B3X624n5n6e6y014Q040C3z6R59040i6+3/0u4X6-6F2@6!3q5.0K1.0L0l6V3/6A6p6#6D5r705T5j636Z6_3x6%0i4T6O5=755}0l5Q32654?6i736L6-775I046s7h6u5y6c6^65756.7r3x4?5k6Y7b7L7D676 7G6W6h7u5{7F5_6#6r6/1@6b7Z5q6@327c3X6Q7y746M7a6Z656%0l0!7P7W357I7:7L7*3{7O7T6g047q7`6C0;7V605=7Y7-357#8d875|5b4 827p827E8l0;7x2!067;5$6%6)0K7$7U8z5%6=2R8B0z6{6}7_8a6q5J8n7/7Q710;797K7M8v887g6G5$7j8j5d8p848N7t8P5T8r7C6P7A8F888%7J8s7~7b7N8i5c8%858K7.8*8Y6a0;6J8g6,7(2v7o8q8B8f936f75993a6H958;046N8^7~7=0;7@0p8J7n610;8@3^8_8u7i818+7v8 9w9D928.9404969f919i9b7w9d5y9m7k5 9I8L8(9F8A9$838-7)9k9N9m9i8t5X8Z9E867R9#9@8076976:9l9}2+8O9`8,9U5)9.a59O9L9ga29A9;5=6%2p0B0R0K9i7 a18|684n174L0l2w2Xat4w1q4y2z2B2x1X1Z2z0A1Haw0T4x0?aJ0W0Y0!04.