[JAVA] Suppression dans un arbre binaire ordonné

Suppression dans un arbre binaire ordonné [JAVA] - Java - Programmation

Marsh Posté le 04-01-2014 à 13:24:56    

Bonjour a tous,
 
Je travaille sur un projet avec des arbres binaires et je suis bloqué a un endroit : pour supprimer dans un arbre binaire.
J'ai beau avoir cherché sur Wikipédia et autre, aucun des codes que j'ai pu voir ne fonctionnait dans mon cas.  
 
Voici ce que j'appelle mon arbre binaire :
 

Code :
  1. public class GenericBinaryTree<V> {
  2.     // ATTRIBUTS
  3.     private Comparable value;
  4.     private GenericBinaryTree SAD;
  5.     private GenericBinaryTree SAG;
  6.     // CONSTRUCTEUR
  7.     public GenericBinaryTree(Comparable val) {
  8.         this.value = val;
  9.         this.SAD = null;
  10.         this.SAG = null;
  11.     }


 
Toutes ses méthodes fonctionnent sauf supprimer que voici :

Code :
  1. // Supprime un noeud a partir de sa valeur  
  2.     public void remove(Comparable val) {
  3.         GenericBinaryTree noeudConcerne, pereNoeud;
  4.         // Le noeud concerné est celui qu'on veut supprimer
  5.         noeudConcerne = this.trouverNoeur(val);
  6.         // On regarde d'abord du coté du SAG du noeud concerné, si il n'est pas nul
  7.         if (noeudConcerne.SAG != null) {
  8.             // pereNoeud est le pere du maximum du SAG du noeud
  9.             pereNoeud = this.SAG.perMax();
  10.             // Si il est nul alors
  11.             if (pereNoeud == null) {
  12.                 this.value = this.SAG.value;
  13.                 this.SAG = this.SAG.SAG;
  14.             } else {
  15.                 this.value = pereNoeud.SAD.value;
  16.                 pereNoeud.SAD = pereNoeud.SAD.SAG;
  17.             }
  18.         }
  19.         // Faire pareil avec sous arbre droit et perMin
  20.     }


 
 
Qui utilise les fonctions suivantes (qui fonctionnent) :
 
 

Code :
  1. // Renvoie le noeud associé a une valeur
  2.     public GenericBinaryTree trouverNoeur(Comparable val) {
  3.         // Si on est au niveau de la valeur recherchée on la selectionne
  4.         if ((this.value).compareTo(val) == 0) {
  5.             return this;
  6.         } else {
  7.             // Sinon on regarde dans le SAG si la valeur est inférieure
  8.             if ((this.value.compareTo(val)) < 0) {
  9.                 if (this.SAG != null) {
  10.                     return this.SAG.trouverNoeur(val);
  11.                 } else {
  12.                     // Si pas de sous arbre gauche, la valeur n'est pas la
  13.                     return null;
  14.                 }
  15.             } else {
  16.                 // Idem SAD si la valeur est supérieure
  17.                 if (this.SAD != null) {
  18.                     return this.SAD.trouverNoeur(val);
  19.                 } else {
  20.                     return null;
  21.                 }
  22.             }
  23.         }
  24.     }
  25.     // Retourne le pere de l'arbre avec la valeur maximale
  26.     public GenericBinaryTree perMax() {
  27.        
  28.         // On initialise la variable résultat
  29.         GenericBinaryTree res = new GenericBinaryTree("error" );
  30.         /* On va chercher quand le SAD s'arrête, quand c'est le cas, on choisit
  31.          * le noeud "grand pere" de cet arbre pour obtenir le pere du max
  32.          */
  33.         if (this.SAD != null) {
  34.             if (this.SAD.SAD == null) {
  35.                 res = this;
  36.             } else {
  37.                 res = this.SAD.perMax();
  38.             }
  39.         } else {
  40.             // Si l'arbre est trop petit on retourne null
  41.             res = null;
  42.         }
  43.         return res;
  44.     }
  45.     // Retourne le pere de l'arbre avec la valeur minimale
  46.     public GenericBinaryTree perMin() {
  47.         // On initialise la variable résultat
  48.         GenericBinaryTree res = new GenericBinaryTree("error" );
  49.         /* On va chercher quand le SAG s'arrête, quand c'est le cas, on choisit
  50.          * le noeud "grand pere" de cet arbre pour obtenir le pere du min
  51.          */
  52.         if (this.SAG != null) {
  53.             if (this.SAG.SAG == null) {
  54.                 res = this;
  55.             } else {
  56.                 res = this.SAG.perMin();
  57.             }
  58.         } else {
  59.             // Si l'arbre est trop petit on retourne null
  60.             res = null;
  61.         }
  62.         return res;
  63.     }


 
 
Quelqu'un comprend t-il mon problème ? Ce que je devrais faire pour que ça fonctionne ?
Le code ci-dessus de supprimer est celui de mon cours que le prof nous a donné sauf que je n'ai pas eu le temps de le recopier intégralement et il est semblerait-il faux.. J'ai essayé de le triturer dans tous les sens ca n'a pas marché c'est pourquoi je vous donne ici 'l'original'..
Ce serait bien sympa je n'en peux plus je suis dessus depuis plusieures heures


Message édité par Odenelle le 04-01-2014 à 14:11:46
Reply

Marsh Posté le 04-01-2014 à 13:24:56   

Reply

Marsh Posté le 04-01-2014 à 13:44:00    

Il me semble que la ligne 59 du dernier extrait de code soit fautive, et donc que cela impacte la partie (qui ne nous est pas montrée) à partir de la ligne 25 du deuxième extrait.
 [:mrdoug]

Reply

Marsh Posté le 04-01-2014 à 14:08:45    

Merci pour ta réponse olivthill en effet j'ai utilisé perMax au lieu de perMin ! je le corrige.
Cependant la partie qui n'est pas montrée, c'est parce qu'elle n'existe pas et je ne vois d'ailleurs pas comment la construire :s, il s'agit de notes que j'ai prises en cours


Message édité par Odenelle le 04-01-2014 à 14:16:14
Reply

Marsh Posté le 04-01-2014 à 14:43:21    

On peut imaginer que la partie manquante serait :

       if (noeudConcerne.SAD != null) {
            // pereNoeud est le pere du minimum du SAD du noeud
            pereNoeud = this.SAD.perMin();
            // Si il est nul alors
            if (pereNoeud == null) {
                this.value = this.SAD.value;
                this.SAD = this.SAD.SAD;
            } else {
                this.value = pereNoeud.SAG.value;
                pereNoeud.SAG = pereNoeud.SAG.SAD;
            }
        }

Reply

Marsh Posté le 04-01-2014 à 15:01:55    

J'avais essayé ça mais ça m'a donné quelque chose de très bizarre, la suppression ne se fessait pas comme prévu (au lieu de supprimer un nœud cela me le mettait en racine de l'arbre par exemple)..  
 
D'autre part je ne sais pas comment gérer la suppression d'un nœud s'il s'agit d'une feuille car faire

Code :
  1. leNoeudaSupprimer = null

ou encore

Code :
  1. leNoeudaSupprimer.value = null

est interdit  (cela génère des erreurs au niveau de la mise a jour de l'interface par la suite..).


Message édité par Odenelle le 04-01-2014 à 15:03:16
Reply

Marsh Posté le 04-01-2014 à 15:18:40    

Remove est comme ceci actuellement :

Code :
  1. // Supprime un noeud a partir de sa valeur  
  2.     public void remove(Comparable val) {
  3.         GenericBinaryTree noeudConcerne, pereNoeud;
  4.         // Le noeud concerné est celui qu'on veut supprimer
  5.         noeudConcerne = this.trouverNoeud(val);
  6.         // Si le noeud concerné a un sous arbre gauche
  7.         if (noeudConcerne.SAG != null) {
  8.             // pereNoeud est le pere du maximum du SAG du noeud
  9.             pereNoeud = this.SAG.perMax();
  10.             System.out.println("coucou1" );
  11.             // Si il est nul alors
  12.             if (pereNoeud == null) {
  13.                 this.value = this.SAG.value;
  14.                 this.SAG = this.SAG.SAG;
  15.                 System.out.println("coucou2" );
  16.             } else {
  17.                 this.value = pereNoeud.SAD.value;
  18.                 pereNoeud.SAD = pereNoeud.SAD.SAG;
  19.                 System.out.println("coucou3" );
  20.             }
  21.         }
  22.        
  23.         if (noeudConcerne.SAD != null) {
  24.             // pereNoeud est le pere du minimum du SAD du noeud
  25.             pereNoeud = this.SAD.perMin();
  26.             System.out.println("coucou4" );
  27.             // Si il est nul alors
  28.             if (pereNoeud == null) {
  29.                 System.out.println("coucou5" );
  30.                 this.value = this.SAD.value;
  31.                 this.SAD = this.SAD.SAD;
  32.             } else {
  33.                 System.out.println("coucou6" );
  34.                 this.value = pereNoeud.SAG.value;
  35.                 pereNoeud.SAG = pereNoeud.SAG.SAD;
  36.             }
  37.         }
  38.     }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed