From b798bfc4b0ff1efc83f60e1e1ce2445e653ae69a Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@pm.me>
Date: Fri, 25 Feb 2022 17:45:33 +0100
Subject: [PATCH] pseudo code suppression feuille ou 1 enfant

---
 slides/cours_16.md | 108 ++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 103 insertions(+), 5 deletions(-)

diff --git a/slides/cours_16.md b/slides/cours_16.md
index 2bf80b9..11e667e 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.
-- 
GitLab