Aller au contenu

Reconstruction d'après les parcours préfixe et infixe

Type d'arbre binaire particulier

Dans cet exercice, on considère des arbres binaires dont les étiquettes sont distinctes et immuables.

Quitte à créer une liste des étiquettes et un dictionnaire associant chaque étiquette à son indice, on peut supposer que les étiquettes sont les entiers de 0 à n - 1, où n est la taille de l'arbre.

Objectif
On donne le parcours préfixe et infixe, retrouver l'arbre !

Prérequis

Il vaut mieux avoir fait avant de nombreux exercices débranchés sur ce thème.

Exemple

graph TB
classDef Nil stroke:none,fill:none,color:none;
    R("2")
    Rg("4")
    R --- Rg
    Rd("5")
    R --- Rd
    Rgg("3")
    Rg --- Rgg
    Rgd(" ")
    Rg -.- Rgd:::Nil
    Rdg("1")
    Rd --- Rdg
    Rdd("6")
    Rd --- Rdd
    Rggg(" ")
    Rgg -.- Rggg:::Nil
    Rggd(" ")
    Rgg -.- Rggd:::Nil
    Rdgg("0")
    Rdg --- Rdgg
    Rdgd(" ")
    Rdg -.- Rdgd:::Nil
    Rddg(" ")
    Rdd -.- Rddg:::Nil
    Rddd(" ")
    Rdd -.- Rddd:::Nil
    Rdggg(" ")
    Rdgg -.- Rdggg:::Nil
    Rdggd(" ")
    Rdgg -.- Rdggd:::Nil
  • Parcours préfixe : [2, 4, 3, 5, 1, 0, 6]
  • Parcours infixe : [3, 4, 2, 0, 1, 5, 6]

On souhaite reconstruire l'arbre donné à l'aide de la classe Noeud.

🐍 Script Python
ab = Noeud(
    2,
    Noeud(
        4,
        Noeud(3),
        None
    ),
    Noeud(
        5,
        Noeud(
            1,
            Noeud(0),
            None
        ),
        Noeud(6),
    )
)

Exercice

Coder une fonction reconstruction qui prend en paramètres deux listes : préfixe puis infixe et qui renvoie l'arbre binaire associé aux deux parcours donnés.

On garantit que les deux listes sont de même taille, composées des entiers de 0 à n - 1n est la taille de l'arbre binaire à reconstruire. On garantit également que ces listes permettent effectivement une reconstruction.

###(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 : /
.128013]x,59/f78rnb N_o=ylaepcwgu)*vd4613kméhtsP(S0+2j[-i:050E0v0N0u0Y0t0O0n0x0t0u0O0O0r010N0Y0w010406050O0A0K0K0u0k0s040R0q0t0A0@0q0l050g0~1012140|0w04051k1d1n0g1k0|0E0Y0D0,0.0:0=0M0Y0z0M0t1B0M0N0`050%0m0t0v1w0/0;011A1C1E1C0N1K1M1I0N0k1l0N0M1O1y010h0)0v0l0u0K0v010,170O0w0u0l0=0U1I1_1{1)1Q1,1M1/1;0`0a0n0P0k0q0w0q0O0Y1a0l0n0#1@0k0k0v0x2i1d200l1l0g1%2v1!1$1#1J0E220=1E0l1.2f1I1t1v0-1P2F0Y2H0l0q2L1I0w2o1l2t2v2Z0}1`2j2N1*2S0k110t0`0n0H2s2%0{2$212)1Q2+2-2/0U2=1{2@2t2E012|0u2.040n0I302u0|332`0=36380n0F3c322%343i2/0e3m3e3o3g350q2,372/0G3t2^2(1x2{3y2}390i3D3f3G3h3I3A390j3M3v3O3x3z3j0f3U2_3W3q040H0S3#3F2O3X3J0H2;1e2?3u3$3.3(0H2 3?313^3-2*3Q380H3b3~3d3E3p430`0H3l473n3_423Y4c3s4f1o2X1d2L2y0E1$2D3w0x2T1=1l4q1m4o2#4m4w0#2Y3V3.0J0`0#0h3m493w0y2/4O3N3`0h0`2o4w0l0O1!0A2q0Y1b4T4I1*0_040Q4+4h2{0`2W0L1,0c0v4;411Q4.0d3m0n4P3%0`2Q4`4|4m4U4-0`0B0Z3t0n5h535b1Q4K044M4}344R395p3w0l4W040u0A0c0)0Y0(2o5t3W4.4:5a4,4?040Y5F3.5052543`0`0V5O5c04514f5j5K3h0`0t5W4 5d5f4f065i5:5#4=0=5m0Y4N5!5S2*5(5R5k0=0q0`0r0r5 5$010K0Y0`3+5J5?014.5-2Z5/5;6k5|5l4X0$0A0k1c5{60010J0x0`0o1b596i6k5h6m5%040k0u0x2Q6B2?5=4~6163666e0l4@0k4_0Y4{5*0=4.0W6!35566(4.0b5g6D6F6)040t0p0z6S6P016204656t676U5M0l0D0v0k0O0v0p576Y6M316:6$6(716I6K2H6+0`6-6 6e6|0X6_3p5U6.6l6u710z5y0x0M7c2u6O346|6~2Z7F5u0`5y5A1E5D7D4H6e5H7g6*7o6`6|0T7s3w694c7l5Y7#55045V6d6`5Q7X7t6=6@7)0B7v5;6:710E2c2h7R7K3W7H7+5T5x5z5B7Q7)5I2#7x7W7J6:7Z861*7%3)8k1Q8j7=7L7@6^7/347;8h8f7-8o6Q047!8r3W8m3=8y678q8J6T5(7^8v3w8x6N7}5~8F3.7q8B686a8n8W1*8Y8%5L6?8u8e674.7`5.6D834J6o0N6q6s8M6`716z0v0A0E8c7V6H6J6L7)5Z8}7?7z4%7C998Z7~800N7R7e5d3t6j6E8z2Q7476787a6Z8*8C7I8T6u7f8Q3W6w6y6A7)7n9b3w6|0C9h0m5(1.949E879w9l9C9n8=5i6:5m0h3y9h8g2?9m7*9y6;0O8Z0q5r2Q9P0`1.0 750u9k9T8.8N72587_6h3@8?8U729t77795v7b7)6%9U5}049;ai5+049K9B8K6R9/715N5.9p8@1*5m2o8`6r9*887O5C0Y5Eam6#0`8d9,6u8m6ca17:0`9aaq6eaQ9gat9Q6=9SaK6faM954^a4a(8:8;6i1d4F0v2v2Wa@4p1u4r2y2B2w0u1La`0g4q0|b40$0(0*04.