Arbres Binaire tri simple d'entier (rapide) ;)

Signaler
Messages postés
2
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
20 juillet 2007
-
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
Bonjour ts le monde



Voila mon probleme trier un arbre recursivement;

Mon code me donne la fameuse erreur segmentation.



J'envoie dans ma fonction l'arbre qui verifie que le cote gauche est
plus petit (pour chaque noeud), ca a l'air ok, ensuite si il est egale
(je sais pas trop mais pas tres grave).

La ou je galere c'est que lorsque mon arbre est arrivé a gauche j'ai l'impression qu'il ne peux plus remonter



Je pense que le code merde pour la branche de droite mais pourquoi? Comment le resoudre!!



/******************************************************************************************/

/** ALGORITHME DE TRI d'un arbre



*/

/******************************************************************************************/

Noeud* tri (Noeud *n){

Noeud *cellule, *T;



if(n==NULL) return n;



if(n->gauche->donnee > n->droite->donnee){

cellule=n->droite; n->droite=n->gauche; n->gauche=cellule;

}

else if(n->gauche->donnee == n->droite->donnee){



/** Suppression de l'element de droite puis on se place dans N->gauche*/

cellule=n->droite; n->droite=cellule->droite;puts("yyyy");



/** On recherche l'element a ajouter dans la liste*/

for(T=n->gauche; T->droite!=NULL; T=T->droite) {}

T->droite=cellule; n=T;puts("lll");

}puts("rrr");
/***** C'est apres le 3 eme que ca merde du a mon arbre initial *******/





n->gauche=tri(n->gauche);

n->droite=tri(n->droite);

}



Merci a ceux qui jetterons un oeil.

Les logiciels c'est comme le sexe c'est meilleur quand c'est libre et gratuit.

1 réponse

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
tu test pas si tu as un fils gauche et un fils droit. ton erreur de segmentation doit arriver quand tu n'a qu'un seul fils (ou pas du tout).

if (n==NULL) return n;if (n->gauche NULL) n->droite tri(n->droite); //seul un fils droit (ou pas de fils)else if (n->droite NULL) n->gauche tri (n->gauche); //seul un fils gauche
else { // deux fils

if(n->gauche->donnee > n->droite->donnee){
cellule=n->droite; n->droite=n->gauche; n->gauche=cellule;
}
else if(n->gauche->donnee == n->droite->donnee){

/** Suppression de l'element de droite puis on se place dans N->gauche*/
cellule=n->droite; n->droite=cellule->droite;puts("yyyy");

/** On recherche l'element a ajouter dans la liste*/
for(T=n->gauche; T->droite!=NULL; T=T->droite) {}
T->droite=cellule; n=T;puts("lll");
}puts("rrr"); /***** C'est apres le 3 eme que ca merde du a mon arbre initial *******/


n->gauche=tri(n->gauche);
n->droite=tri(n->droite);
}

return n;
}