Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
533 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Suppression dans un arbre binaire ordonné

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JAVA] Suppression dans un arbre binaire ordonné

n°2214930
Odenelle
Posté le 04-01-2014 à 13:24:56  profilanswer
 

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
mood
Publicité
Posté le 04-01-2014 à 13:24:56  profilanswer
 

n°2214933
olivthill
Posté le 04-01-2014 à 13:44:00  profilanswer
 

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]

n°2214935
Odenelle
Posté le 04-01-2014 à 14:08:45  profilanswer
 

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
n°2214938
billgatesa​nonym
Posté le 04-01-2014 à 14:43:21  profilanswer
 

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;
            }
        }

n°2214940
Odenelle
Posté le 04-01-2014 à 15:01:55  profilanswer
 

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
n°2214945
Odenelle
Posté le 04-01-2014 à 15:18:40  profilanswer
 

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.     }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Suppression dans un arbre binaire ordonné

 

Sujets relatifs
[Java] ArrayListProgrammation Java lecture base de données
Exécuter des tests JUnit depuis JavaDélai d'exécution de Java avec Windows 8 + Nvidia
Position contraintes catia dans l'arbreJava Débutant
projet jeu en java[JAVA] aide compilation d'un programme
Projet de fin d'année. (Java,Html,MySQL,PHP)Aide tri par selection java's cool
Plus de sujets relatifs à : [JAVA] Suppression dans un arbre binaire ordonné


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR