Suppression dans un arbre Binaire

Fermé
Odenelle Messages postés 102 Date d'inscription samedi 19 novembre 2011 Statut Membre Dernière intervention 18 mars 2016 - Modifié par Odenelle le 4/01/2014 à 14:09
Odenelle Messages postés 102 Date d'inscription samedi 19 novembre 2011 Statut Membre Dernière intervention 18 mars 2016 - 4 janv. 2014 à 19:41
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 :

public class GenericBinaryTree<V> {

// ATTRIBUTS
private Comparable value;
private GenericBinaryTree SAD;
private GenericBinaryTree SAG;

// CONSTRUCTEUR
public GenericBinaryTree(Comparable val) {
this.value = val;
this.SAD = null;
this.SAG = null;
}

Toutes ses méthodes fonctionnent sauf supprimer que voici :

// Supprime un noeud a partir de sa valeur
public void remove(Comparable val) {

GenericBinaryTree noeudConcerne, pereNoeud;


// Le noeud concerné est celui qu'on veut supprimer
noeudConcerne = this.trouverNoeur(val);


// On regarde d'abord du coté du SAG du noeud concerné, si il n'est pas nul
if (noeudConcerne.SAG != null) {
// pereNoeud est le pere du maximum du SAG du noeud
pereNoeud = this.SAG.perMax();
// Si il est nul alors
if (pereNoeud == null) {
this.value = this.SAG.value;
this.SAG = this.SAG.SAG;
} else {
this.value = pereNoeud.SAD.value;
pereNoeud.SAD = pereNoeud.SAD.SAG;
}

}
// Faire pareil avec sous arbre droit et perMin
}


Qui utilise les fonctions suivantes (qui fonctionnent) :


// Renvoie le noeud associé a une valeur
public GenericBinaryTree trouverNoeur(Comparable val) {

// Si on est au niveau de la valeur recherchée on la selectionne
if ((this.value).compareTo(val) == 0) {
return this;
} else {
// Sinon on regarde dans le SAG si la valeur est inférieure
if ((this.value.compareTo(val)) < 0) {
if (this.SAG != null) {
return this.SAG.trouverNoeur(val);
} else {
// Si pas de sous arbre gauche, la valeur n'est pas la
return null;
}
} else {
// Idem SAD si la valeur est supérieure
if (this.SAD != null) {
return this.SAD.trouverNoeur(val);
} else {
return null;
}
}
}
}

// Retourne le pere de l'arbre avec la valeur maximale
public GenericBinaryTree perMax() {

// On initialise la variable résultat
GenericBinaryTree res = new GenericBinaryTree("error");
/* On va chercher quand le SAD s'arrête, quand c'est le cas, on choisit
* le noeud "grand pere" de cet arbre pour obtenir le pere du max
*/
if (this.SAD != null) {
if (this.SAD.SAD == null) {
res = this;
} else {
res = this.SAD.perMax();
}
} else {
// Si l'arbre est trop petit on retourne null
res = null;
}
return res;
}

// Retourne le pere de l'arbre avec la valeur minimale
public GenericBinaryTree perMin() {
// On initialise la variable résultat
GenericBinaryTree res = new GenericBinaryTree("error");
/* On va chercher quand le SAG s'arrête, quand c'est le cas, on choisit
* le noeud "grand pere" de cet arbre pour obtenir le pere du min
*/
if (this.SAG != null) {
if (this.SAG.SAG == null) {
res = this;
} else {
res = this.SAG.perMin();
}
} else {
// Si l'arbre est trop petit on retourne null
res = null;
}
return res;
}


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
A voir également:

1 réponse

Odenelle Messages postés 102 Date d'inscription samedi 19 novembre 2011 Statut Membre Dernière intervention 18 mars 2016 20
4 janv. 2014 à 19:41
J'ai amélioré remove (du moins je crois)

// Supprime un noeud a partir de sa valeur 
public void remove(V val) {

GenericBinaryTree<V> noeudConcerne, pereNoeud;


// Le noeud concerné est celui qu'on veut supprimer
noeudConcerne = this.trouverNoeud(val);


// Si le noeud concerné a un sous arbre gauche
if (noeudConcerne.SAG != null) {
// pereNoeud est le pere du maximum du SAG du noeud
pereNoeud = this.SAG.perMax();
System.out.println("coucou1");
// Si il est nul alors
if (pereNoeud == null) {
this.value = this.SAG.value;
this.SAG = this.SAG.SAG;
System.out.println("coucou2");
} else {
this.value = pereNoeud.SAD.value;
pereNoeud.SAD = pereNoeud.SAD.SAG;
System.out.println("coucou3");
}

}

if (noeudConcerne.SAD != null) {
// pereNoeud est le pere du minimum du SAD du noeud
pereNoeud = this.SAD.perMin();
System.out.println("coucou4");
// Si il est nul alors
if (pereNoeud == null) {
System.out.println("coucou5");
this.value = this.SAD.value;
this.SAD = this.SAD.SAD;
} else {
System.out.println("coucou6");
this.value = pereNoeud.SAG.value;
pereNoeud.SAG = pereNoeud.SAG.SAD;
}
}
}
0