je n'arrive pas à faire ce que l'on me demande pour le coup je pense que c'est surtout un soucis conceptuel et algorithmique plus que de codage =)
Il s'agit de trier un arbre
Donc la structure d'un tel arbre serait ceci
- Code: Tout sélectionner
typedef struct unfeuille {
int val;
struct unfeuille *gauche;
struct unfeuille *droite;
}feuille;
typedef struct unfeuille * GRD;
Alors avant de me faire taper sur les doigts; oui j'ai bien retenu que c'est moche de cacher un pointeur avec typedef; mais c'est comme ça pour le cours donc ... cela dit, j'ai bien retenu c'est mal et il est mieux de passer des doubles pointeurs.
Bref là n'est pas la question.
Afin de trier un tel arbre, j'ai dans un premier temps effectué une fonction qui réalise le travail de façon récursive.
- Code: Tout sélectionner
void triGRD(GRD a)
{
if(!estVideGRD(a))
{
triGRD(a->gauche);
printf("%d\n",a->val);
triGRD(a->droite);
}
}
Il serait plus judicieux de dire qu'elle affiche un arbre trié, l'arbre en lui même ne change pas.
Maintenant je dois effectuer le même travail, mais sans récursivité. Pour cela on m'a dit en cours que je devrais utiliser une structure de pile sur les noeuds de l'arbre; j'ai testé plusieurs choses mais je ne crois pas que ce soit bon; d'ailleurs à l'exécution je vois bien les erreurs de segmentation et je pense que ça vient plutot de la structure avant de venir de l'algorithme
Qu'en pensez vous ?
- Code: Tout sélectionner
typedef struct elpile {
feuille f;
struct elpile * suivant; //pointeur sur la feuille suivante
}celpile;
typedef struct elpile * pile;
- Code: Tout sélectionner
void triIteratifGRD(GRD a)
{
pile p=INIT_PILE();
celpile n,nd,ng;
if(!estVideGRD(a))
{
EMPILER(&p,a->val);
}
while(!PILE_VIDE(p))
{
n.f.val=TOP(p);
p=DEPILER(p);
if((n.f.gauche==NULL) && (n.f.droite==NULL))
{
printf("%d\n",n.f.val);
}
else
{
if(n.f.droite !=NULL)
{
nd.f.val=n.f.droite->val;
ng.f.val=n.f.gauche->val;
printf("OK\n");
EMPILER(&p,nd.f.val);
n.f.gauche=NULL;
n.f.droite=NULL;
EMPILER(&p,n.f.val);
if(ng.f.gauche != NULL)
{
EMPILER(&p,ng.f.val);
}
}
}
}
}
Merci pour votre aide !
