diff --git a/slides/cours_16.md b/slides/cours_16.md index 2bf80b9cbd0324ea7f52604b5c51f0845346633b..11e667e0cf860e2bece422e22559648047bc51f7 100644 --- a/slides/cours_16.md +++ b/slides/cours_16.md @@ -53,6 +53,7 @@ ajout(arbre, clé) si est_vide(arbre) arbre = noeud(clé) sinon + arbre = position(arbre, clé) si clé < clé(arbre) gauche(arbre) = noeud(clé) sinon si clé > clé(arbre) @@ -142,8 +143,6 @@ memory would be allocated: # La suppression de clé -* Cas simples: le noeud à supprimer et est feuill ou a un seul fils. -* Comment faites-vous? . . . @@ -151,7 +150,13 @@ memory would be allocated: :::: column -Une feuille (le 19 p.ex.). +## Cas simples: + +* le noeud est absent, +* le noeud est une feuille +* le noeuds a un seul fils. + +## Une feuille (le 19 p.ex.). ```{.mermaid format=pdf width=400 loc=figs/} flowchart TB; @@ -165,7 +170,7 @@ flowchart TB; :::: column -Un seul fils (le 20 p.ex.). +## Un seul fils (le 20 p.ex.). ```{.mermaid format=pdf width=400 loc=figs/} flowchart TB; @@ -180,18 +185,23 @@ flowchart TB; style 18 fill:#fff,stroke:#fff,color:#fff ``` +## Dans tous les cas + +* Chercher le noeud à supprimer: utiliser `position()`. + :::: ::: # La suppression de clé -## Cas compliqué ::: columns :::: column +## Cas compliqué + * Le noeud à supprimer à (au moins) deux descendants (10). ```{.mermaid format=pdf width=400 loc=figs/} @@ -214,10 +224,98 @@ flowchart TB; * On peut pas juste enlever `10` et recoller... * Proposez une solution bon sang! +. . . + +## Solution + +* Échange de la valeur à droite dans le sous-arbre de gauche ou + ... +* de la valeur de gauche dans le sous-arbre de droite! + :::: ::: +# Le pseudo-code de la suppression + +## Pour une feuille ou absent (ensemble) + +``` +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_feuill) + 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` + +## Pseudo-code pour trouver le parent (5min -> matrix) + +``` +arbre parent(arbre, sous_arbre) + si est_non_vide(arbre) + actuel = arbre + clé = clé(sous_arbre) + faire + parent = actuel + si (clé != clé(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 + +## Pour un seul enfant (5min -> matrix) + +``` +arbre suppression(arbre, clé) + sous_arbre = position(arbre, clé) + si est_vide(sous_arbre) ou clé(sous_arbre) != clé + retourne vide + sinon + 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 + +## Pour au moins deux enfants (ensemble) + + + + + + + # Trier un tableau à l'aide d'un arbre binaire * Tableau représenté comme un arbre binaire.