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
.128013s3o8bcdufvg/0ly n7apSr1me,(P2=4:+twki9][5h*)6050h0z0I0t0L0o0b0q0g0o0t0b0b0E010I0L0u010406050b0i0y0y0t0w0p040v0d0o0i0.0d0r050m0^0`0|0~0?0u04171e051h0m1h1j1e0?0h0L0k0$0(0*0,0Q0L0l0Q0o1x0Q0I0;050X0f0o0z1s0)0+011w1y1A1y0I1G1I1E0I0f0d0h0~1F0w1f0I0Q0$110b0u0t0r0,0D011K1u010j0Z0z0r0t0y0z1E1,1.1?1M1_1I1|1~0;0a0q0C0w0d0u0d0b0L140r0q0V1*0w0w0z0g2j17210r1f0m1(2w0I1$1#1%0h230,1A0r1{2g1E1p1r0%1L2G0L2I0r1Y1q1E0u2p1f2u2w2!0@1-2k2O1@2T0w0{0o0;0q0x2t2(0=2%222*1M2,2.2:0D2?1.2^2u2F012}0t2/040q0c312v0?342{0,37390q0F3d332(353j2:0P3n3f3p3h360d2-382:0T3u2_2)1t2|3z2~3a0s3E3g3H3i3J3B3a0e3N3w3P3y3A3k0M3V2`3X3r040x0n3$3G2P3Y3K0x2=182@3v3%3/3)0x303@323_3.2+3R390x3c3 3e3F3q440;0x3m483o3`433Z4d3t4g414b4k3*3D4g1g2Y172M2z0h2D350g1Y1 1f4x1i4v2$4t4C0V2Z3W3/0K0;0V0j3n4a3x0J2:4U3O3{0j0;4C0r0b2A0i2r0L154Z4O1@0:040B4:4i2|0;0|0f2p3?2$4!4=0;0A3n0q4V3(4|0w4~0z3~514;1M4?0S0G3u0q5m57524{04164g5o5g0,0d0;0E56583{0f0;264_425h0;4^4t5p3i5a5c502@5B53040S5l5n5S5q0y5A5M015x045z5t5Y3i5D045F5L5v014?5K5f4`5N044}2p5e5R5$5i5W5m5,365O2p5#5=5(5*2!5u5`5?0;0O5G350y0L0;3,5;6f4?0N696f5(0R6t5H0,5@6j3x0r0;5s6d655(0H6x3q0;5!5+5$6I6K3x6l4d6B3X624n5n6e6y014Q040j3z6R59040L6+3/0d4X6-6F2@6!3q5.0w1.0l0z6V3/6A6p6#6D5r705T5j636Z6_3x6%0L4T6O5=755}0z5Q32654?6i736L6-775I046s7h6u5y6c6^65756.7r3x4?5k6Y7b7L7D676 7G6W6h7u5{7F5_6#6r6/1@6b7Z5q6@327c3X6Q7y746M7a6Z656%0z0!7P7W357I7:7L7*3{7O7T6g047q7`6C0;7V605=7Y7-357#8d875|5b4 827p827E8l0;7x2!067;5$6%6)0w7$7U8z5%6=2R8B0r6{6}7_8a6q5J8n7/7Q710;797K7M8v887g6G5$7j8j5d8p848N7t8P5T8r7C6P7A8F888%7J8s7~7b7N8i5c8%858K7.8*8Y6a0;6J8g6,7(2v7o8q8B8f936f75993a6H958;046N8^7~7=0;7@0b8J7n610;8@3^8_8u7i818+7v8 9w9D928.9404969f919i9b7w9d5y9m7k5 9I8L8(9F8A9$838-7)9k9N9m9i8t5X8Z9E867R9#9@8076976:9l9}2+8O9`8,9U5)9.a59O9L9ga29A9;5=6%2p0I0i0w9i7 a18|684n174L0z2w2Xat4w1q4y2z2B2x1X1Z2z0t1Haw0m4x0?aJ0W0Y0!04.