#include /* On va ranger les valeurs dans un arbre binaire Comme ‡a les données sont triées à la saisie et on ne perd pas de temps en tri ultérieurement Chaque feuille de l'arbre possède une valeur entrée ainsi qu'un pointeur vers une feuille gauche et une feuille droite. */ typedef struct _feuille { struct _feuille* gauche; struct _feuille* droite; int val; } feuille, *pfeuille; /* Pour chaque valeur: - on crée une feuille (ne pointant sur rien) - si l'arbre n'existe pas, c'est cette feuille qui devient la racine - on parcourt l'arbre feuille par feuille si la nouvelle valeur est inférieure à celle de la feuille en cours on continue le parcours à gauche, sinon, on continue à droite. Si l'emplacement sur lequel on tomberait alors n'existe pas, on y attache la nouvelle feuille, sinon, on recommence cette étape. */ pfeuille arbre_ajout_feuille(pfeuille f, int val) { pfeuille n, tmp = f; n = (pfeuille)malloc(sizeof(feuille)); n->gauche = n->droite = NULL; n->val = val; while (tmp) { if (n->val < tmp->val) { if (!tmp->gauche) { tmp->gauche = n; break; } tmp = tmp->gauche; } else { if (!tmp->droite) { tmp->droite = n; break; } tmp = tmp->droite; } } return (f ? f : n); } /* On parcourt l'arbre pour l'afficher. On commence par descendre tout à gauche (valeur mini), puis on remonte d'un cran, on va à droite et on recommence. */ void arbre_affiche(pfeuille f) { if (!f) { return; } if (f->gauche) { arbre_affiche(f->gauche); } printf("%d\n", f->val); if (f->droite) { arbre_affiche(f->droite); } } /* On lit les valeurs, on remplit l'arbre et on le parcourt pour l'affichage des valeurs */ int main (void) { int nb, tmp; pfeuille arbre = NULL; scanf("%d", &nb); while(nb--) { scanf ("%d", &tmp); arbre = arbre_ajout_feuille(arbre, tmp); }; arbre_affiche(arbre); }