begin process at 2012 05 25 02:47:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Divers

 > 

Général

 > 

Suppression dans les avl


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Suppression dans les avl

lundi 29 décembre 2008 à 18:26:17 | Suppression dans les avl

chouki221

Bonjour,
Bonjour à tous je viens de trouver le code source de la supprssion dans un AVL, mais y'a une petite instruction qui m'intrigue

/** suppression du min (recursif) <br> la variable min va contenir la valeur du min supprimé
@param P : Noeud de depart
@param PP : Noeud parent
public boolean delMin(AVLNode PP,AVLNode P)
{
if (P.getLeft()==null) //trouvé, c'est le min
{
min=P.getValue(); //la variable globale contient le min

//on supprime le min
if (PP==null)
root=P.getRight(); //racine
else if (PP.getRight()==P)
PP.setRight(P.getRight()); //droite
else
PP.setLeft(P.getRight()); //gauche

return true;

}else //on cherche (recursif)
{
if (delMin(P,P.getLeft()))
{
//doit mettre a jour son deseq : on demande au parent de modifier son deseq uniquement
//si son fils a son deseq qui vient de passer a 0
P.setDeseq(P.getDeseq()-1); //mise a jour du deseq
return (reequilibre(PP,P)==0);
}
}
return false;
}

/** suppression recursive */
public boolean del(int val)
{
delete(null,root,val);
return true;
}

/** reequilibre un noeud pour la suppression
@param PP parent du noeud a rééquilibrer
@param P noeud a rééquilibrer
@return le nouveau désequilibre du noeud
*/
private int reequilibre(AVLNode PP,AVLNode P)
{
if (P.getDeseq()==2 || P.getDeseq()==-2) //on doit rééquilibrer
{
if (PP==null)
{
root=reequilibrage(P); //racine
return root.getDeseq();
}else if (PP.getRight()==P) //droite
{
PP.setRight(reequilibrage(PP.getRight()));
return PP.getRight().getDeseq();
}
else
{ //gauche
PP.setLeft(reequilibrage(PP.getLeft()));
return PP.getLeft().getDeseq();
}
}
return P.getDeseq();
}

/** suppression recursive
@param P Noeud a considerer
@param PP parent de P
@param val valeur du noeud a supprimer
@return true si le noeud doit mettre a jour son deseq (usage interne a la fonction récursive)
*/
private boolean delete(AVLNode PP,AVLNode P,int val)
{
if (P==null) return false;

if (P.getValue()==val) //noeud a supprimer trouvée
{
if (P.getRight()!=null && P.getLeft()!=null) //2 fils
{
int d=P.getRight().getDeseq(); //on retiens le déseq a droite pour voir s'il a changé
boolean s=delMin(P,P.getRight()); //supprime le min a droite
// System.out.println("min deleted="+min);
//la variable globale min contient le min trouvé

P.setValue(min);
if (s || (P.getRight()!=null && P.getRight().getDeseq()==0 && P.getRight().getDeseq()!=d))
{
P.setDeseq(P.getDeseq()+1); //mise a jour du desequilibre du noeud
return (reequilibre(PP,P)==0); //on rééquilibre
}
return false;//le noeud parent n'as pas besoin de mettre a jour son deseq


}else
{
if (P.getRight()!=null) //1 fils a droite
{
//efface P
if (PP==null) //racine
root=P.getRight();
else if (PP.getRight()==P)
PP.setRight(P.getRight()); //droite
else PP.setLeft(P.getRight()); //gauche

return true; //le noeud parent doit se mettre a jour
}else //1 fils a gauche
{
//efface P
if (PP==null)
root=P.getLeft(); //racine
else if (PP.getRight()==P)
PP.setRight(P.getLeft()); //droite
else PP.setLeft(P.getLeft()); //gauche

return true; //le noeud parent doit se mettre a jour
}
}

}else //c'est pas le bon noeud, on descendre plus bas
{
//appel recursif selon la valeur du noeud a supprimer
if (val<P.getValue()) //doit aller a gauche
{
if (delete(P,P.getLeft(),val))
P.setDeseq(P.getDeseq()-1);

return (reequilibre(PP,P)==0); //rééquilibrage si necessaire
}
}
else{
if (delete(P,P.getRight(),val)) //appel recusrsif vers la droite
{
P.setDeseq(P.getDeseq()+1);
return (reequilibre(PP,P)==0); //rééquilibrage si necessaire
}
}


}


return false;

}


Le return false c'est cette instruction qui mintrigue, si c'est un return false cela veut dire que je peux pas termnier l'execution du reste des appels recursif
if (delete(P,P.getLeft(),val)) //suppression à gauche
P.setDeseq(P.getDeseq()-1);

Ce qui signifie que je met pas à jour le déséquilibre du pére du noeud qui a été supprimé, mais en principe sa se passe pas comme sa on doit mettre a jour le desq du pére, et du grd pére...jusqu'a à la racine puisque ces des appel récursifs..et c'est en fonction du deséquilibre qu'il peut y'avoir réequilibrage si nécessaire
return (reequilibre(PP,P)==0);//rééquilibrage si necessaire
Cordialement
mardi 30 décembre 2008 à 12:56:08 | Re : Suppression dans les avl

nickadele

Membre Club Administrateur CodeS-SourceS
A mon avis tu t'es trompé de catégorie !
Je redirige ta demande vers Java.

Nickadele


Cette discussion est classée dans : return, noeud, pp, getright, if


Répondre à ce message

Sujets en rapport avec ce message

arbre avl [ par leray24na ] Bonsoir à tous,J'ai implementé un arbre en java.Maintenant je souhaiterai avoir la possibilité de demander l'ajout, la suppression ou la recherche d'u ajout [ par jspimen ] bonjour; voici mon code qui permet d'ajouter des données dans une base Mysql <%@ page import= Arbre de decision:JTree non affiché!!svp aidez moi [ par lucioamine ] J'ai essayé sans cesse de pouvoir afficher le Jtree mais j'arrive pas.J'utilise l'algorithme ID3 de Quilan. Mon projet contient 5 classes: -main -Tabl erreur sur le code huffman [ par lekludo ] bonjour a vousj'ai un probleme je suis débutant en java et j'ai un petit proget qui m'a été donné sur le code de huffman seulement lorsque j'exécute, stucture d'arbre [ par jeff705 ] Bonjour, j'ai une fonction (java) qui lit une structure d'arbre (généalogique). Le noeud a chaque fois 2fils: public void lire_arbre(Node n) { polygones convexes [ par beatriz42 ] Bonjour à tous Est ce quelqu'un pourrait m'aider. Je n'arrive pas à trouver une fonction qui est-convexe qui me permet de créer un polygone convexe à extraction de la date d'un fichier excel [ par tege ] Bonjour, J'ai rencontré un probleme[^^sad2]...je suis debutante en programmation .. j'ai effectuer un code java qui me permet d'afficher le contenu d bloqué!! [ par tomi45 ] bonjour , je suis actuellement en 1ere année de licence et j'ai un projet sur lequel je suis bloqué par l'affichage suivant :Exception in thread main les listes chainées [ par foxriver001 ] au fait j'ai implémenté les listes chainées en java mais le programme ne marche pas correctement,j'ai donc besoin de l'aide de quelqu'un .voici le pro switch case Vs Else if [ par omcougar ] Bonjour,Une question purement d'optimisation:Etant donné que l'on peut faire la meme chose avec la fonction "switch/case" ou des "if / elsif" je pense


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,903 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales