From 4e3fb5676a29c807278b5aef7fc3f235e967e7f8 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Fri, 14 Mar 2025 10:20:46 +0100 Subject: [PATCH] corrected changes --- slides/cours_16.md | 2 - slides/cours_17.md | 130 +++++++++++++++++++++++---------------------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/slides/cours_16.md b/slides/cours_16.md index 3594721..cdbd78b 100644 --- a/slides/cours_16.md +++ b/slides/cours_16.md @@ -891,5 +891,3 @@ booléen recherche(arbre, clé) 3. Écrire une fonction qui insère des mots dans un arbre et ensuite affiche l'arbre. - -[^2]: Copyright cours de mathématiques pendant trop d'années. diff --git a/slides/cours_17.md b/slides/cours_17.md index 9806a4c..14f14ed 100644 --- a/slides/cours_17.md +++ b/slides/cours_17.md @@ -14,6 +14,8 @@ date: "2025-03-14" # Pseudo-code d'insertion (1/4) +\footnotesize + * Deux parties: * Recherche le parent où se passe l'insertion. * Ajout de l'enfant dans l'arbre. @@ -34,7 +36,7 @@ arbre position(tree, clé) sinon suivant = droite(tree) - retourne suivant + retourne tree ``` # Pseudo-code d'insertion (2/4) @@ -159,8 +161,8 @@ node *add_key(node **tree, key_t key) { flowchart TB; 10-->20; 10-->5 - 20-->21 20-->19 + 20-->21 ``` :::: @@ -236,25 +238,26 @@ flowchart TB; ::: +# Le pseudo-code de la suppression -# Le pseudo-code de la suppression +## Pour une feuille ou absent (ensemble) -## Pour une feuille ou clé absente (ensemble) - -```python -booléen suppression(tree, clé) - noeud = position(tree, clé) - si est_vide(noeud) ou clé(noeud) != clé - retourne faux - si est_feuille(noeud) - noeud_parent = parent(tree, noeud) - si est_vide(noeud_parent) # noeud == racine - noeud = vide - sinon si gauche(noeud_parent) == noeud - gauche(noeud_parent) = vide - sinon si droite(noeud_parent) == noeud - droite(noeud_parent) = vide - retourne vrai +``` +arbre suppression(arbre, clé) + sous_arbre = position(arbre, clé) + si est_vide(sous_arbre) ou clé(sous_arbre) != clé + retourne vide + sinon + si est_feuille(sous_arbre) et clé(sous_arbre) == clé + nouvelle_feuille = parent(arbre, sous_arbre) + si est_vide(nouvelle_feuille) + arbre = vide + sinon + si gauche(nouvelle_feuille) == sous_arbre + gauche(nouvelle_feuille) = vide + sinon + droite(nouvelle_feuille) = vide + retourne sous_arbre ``` # Il nous manque le code pour le `parent` @@ -264,67 +267,66 @@ booléen suppression(tree, clé) . . . ``` -arbre parent(tree, noeud) - parent = vide - si noeud != tree - actuel = tree - clé = clé(noeud) +arbre parent(arbre, sous_arbre) + si est_non_vide(arbre) + actuel = arbre + parent = actuel + clé = clé(sous_arbre) faire - parent = actuel - si clé < clé(actuel) - actuel = gauche(actuel) - sinon si clé > clé(actuel) - actuel = droite(actuel) - tant_que (actuel != noeud) - retourne parent + si (clé != clé(actuel)) + parent = actuel + si clé < clé(actuel) + actuel = gauche(actuel) + sinon + actuel = droite(actuel) + sinon + retour parent + tant_que (actuel != sous_arbre) + retourne vide ``` -# Le pseudo-code de la suppression +# Le pseudo-code de la suppression \footnotesize -## S'il y a un enfant à gauche (5min -> matrix) +## Pour un seul enfant (5min -> matrix) . . . -```python -booléen suppression(tree, clé) - noeud = position(tree, clé) - subtree = position(gauche(noeud), clé) - val_proche = clé(subtree) - si est_vide(droite(noeud)) - gauche(noeud) = gauche(subtree) - sinon - suppression(tree, val_proche) - clé(noeud) = val_proche - retourne vrai +``` +arbre suppression(arbre, clé) + sous_arbre = position(arbre, clé) + si est_vide(gauche(sous_arbre)) ou est_vide(droite(sous_arbre)) + parent = parent(arbre, sous_arbre) + si est_vide(gauche(sous_arbre)) + si droite(parent) == sous_arbre + droite(parent) = droite(sous_arbre) + sinon + gauche(parent) = droite(sous_arbre) + sinon + si droite(parent) == sous_arbre + droite(parent) = gauche(sous_arbre) + sinon + gauche(parent) = gauche(sous_arbre) + retourne sous_arbre ``` -# Le pseudo-code de la suppression +# Le pseudo-code de la suppression \footnotesize -## Bilan (ensemble) - -``` -booléen suppression(tree, clé) - noeud = position(tree, clé) - si est_vide(noeud) ou clé(noeud) != clé - retourne faux - si est_feuille(noeud)) - noeud_parent = parent(tree, noeud) - ... - retourne vrai - si est_non_vide(gauche(noeud)) - subtree = position(gauche(noeud), clé) - ... - retourne vrai - si est_non_vide(gauche(noeud)) - subtree = position(droite(noeud), clé) - ... - retourne vrai +## Pour au moins deux enfants (ensemble) + ``` +arbre suppression(arbre, clé) + sous_arbre = position(arbre, clé) # on revérifie pas que c'est bien la clé + si est_non_vide(gauche(sous_arbre)) et est_non_vide(droite(sous_arbre)) + max_gauche = position(gauche(sous_arbre), clé) + échange(clé(max_gauche), clé(sous_arbre)) + suppression(gauche(sous_arbre), clé) +``` + # Exercices (poster sur matrix) -- GitLab