1 /*****************************************************************************/
2 /* ABR : arbres binaires de recherche */
3 /*****************************************************************************/
10 typedef struct noeud
{
17 /* Creation d'un ABR vide */
24 /* Insertion/Ajout d'un nouvel element dans l'ABR */
25 NOEUD
*insere(NOEUD
* p
, element x
)
28 p
= (NOEUD
*) malloc(sizeof(NOEUD
));
32 } else if (x
== p
->valeur
)
33 printf("%d est deja dans l'arbre\n", x
);
34 else if (x
< p
->valeur
)
35 p
->gauche
= insere(p
->gauche
, x
);
37 p
->droit
= insere(p
->droit
, x
);
42 /* Recherche d'un element dans l'ABR */
43 int recherche(NOEUD
* p
, element x
)
50 return recherche(p
->gauche
, x
);
52 return recherche(p
->droit
, x
);
56 /* Affichage du contenu de l'ABR en ordre croissant (par parcours profondeur infixe) */
57 void affiche(NOEUD
* p
)
61 printf("%d ", p
->valeur
);
67 /* Affichage de l'arbre (sous forme arborescente) */
68 void affiche_arbre(NOEUD
* p
, int col
)
73 affiche_arbre(p
->droit
, col
+ 1);
74 for (i
= 0; i
< col
; i
++)
76 printf("%d\n", p
->valeur
);
77 affiche_arbre(p
->gauche
, col
+ 1);
82 /* Copie d'arbre (on cree physiquement le double de l'arbre de racine p) */
83 NOEUD
*copie_arbre(NOEUD
* p
)
90 q
= (NOEUD
*) malloc(sizeof(NOEUD
));
91 q
->valeur
= p
->valeur
;
92 q
->gauche
= copie_arbre(p
->gauche
);
93 q
->droit
= copie_arbre(p
->droit
);
99 /* Destruction de l'arbre de racine p en recuperant la place occupee (free) par chacun des noeuds */
100 NOEUD
*detruis_arbre(NOEUD
* p
)
105 p
->gauche
= detruis_arbre(p
->gauche
);
106 p
->droit
= detruis_arbre(p
->droit
);
114 /* Maximum d'un sous-arbre de racine p (i.e., le noeud le plus a droite) */
115 NOEUD
*max(NOEUD
* p
, NOEUD
* r
)
119 if (r
->droit
== NULL
) {
120 p
->valeur
= r
->valeur
;
121 q
= r
; /* q : l'element a supprimer par free */
125 r
->droit
= max(p
, r
->droit
);
130 /* Suppression du noeud de valeur x dans l'arbre de racine p.
131 Suppression d'un noeud interne : la valeur du noeud a supprimer est
132 remplacee par celle du noeud le plus a droite de son sous-arbre gauche */
133 NOEUD
*supprime(NOEUD
* p
, element x
)
138 printf("%d n'est pas dans l'arbre\n", x
);
139 else if (x
== p
->valeur
) { /* suppression de p */
140 if (p
->droit
== NULL
) {
144 } else if (p
->gauche
== NULL
) {
149 p
->gauche
= max(p
, p
->gauche
);
150 } else if (x
< p
->valeur
)
151 p
->gauche
= supprime(p
->gauche
, x
);
153 p
->droit
= supprime(p
->droit
, x
);
158 /* Chargement d'un arbre depuis un fichier */
159 NOEUD
*charge(NOEUD
* p
, FILE * fich
)
162 p
= (NOEUD
*) malloc(sizeof(NOEUD
));
163 fread(p
, sizeof(NOEUD
), 1, fich
);
164 p
->gauche
= charge(p
->gauche
, fich
);
165 p
->droit
= charge(p
->droit
, fich
);
171 /* Sauvegarde d'un arbre dans un fichier */
172 NOEUD
*sauve(NOEUD
* p
, FILE * fich
)
175 fwrite(p
, sizeof(NOEUD
), 1, fich
);
176 p
->gauche
= sauve(p
->gauche
, fich
);
177 p
->droit
= sauve(p
->droit
, fich
);
185 /*****************************************************************************/
188 NOEUD
*abr
; /* on peut travailler sur 3 arbres */
197 ("Commandes (une lettre) possibles : v arbre_vide ; r rechercher ; i inserer ; c copier ; d detruire ; a afficher contenu ; A affiche arborescence ; s supprimer ; C charger ; S sauvegarder)\n");
200 printf("Commande ? ");
208 printf("indiquer l'element a rechercher : ");
210 if (recherche(abr
, x
) == 0)
211 printf("pas trouve\n");
217 printf("indiquer l'element a inserer : ");
219 abr
= insere(abr
, x
);
223 abr2
= copie_arbre(abr
);
227 abr
= detruis_arbre(abr
);
229 abr2
= detruis_arbre(abr2
);
235 printf("\nLa copie : \n");
241 affiche_arbre(abr
, 1);
243 printf("\nLa copie : \n");
244 affiche_arbre(abr2
, 1);
249 printf("indiquer l'element a supprimer : ");
251 abr
= supprime(abr
, x
);
255 printf("indiquer le nom de fichier pour le chargement : ");
256 scanf("%s", nom_fich
);
257 if ((fich
= fopen(nom_fich
, "rb")) != NULL
) {
258 abr
= (NOEUD
*) malloc(sizeof(NOEUD
));
259 abr
= charge(abr
, fich
);
265 printf("indiquer le nom de fichier pour la sauvegarde : ");
266 scanf("%s", nom_fich
);
267 if ((fich
= fopen(nom_fich
, "wb")) != NULL
) {
268 abr
= sauve(abr
, fich
);
284 /* Trace d'execution **************************************
285 Commandes (une lettre) possibles : v arbre_vide ; r rechercher ; i inserer ; c copier ; d detruire ; a afficher contenu ; A affiche arborescence ; s supprimer ; C charger ; S sauvegarder)
289 indiquer l'element a inserer : 2
292 indiquer l'element a inserer : 6
295 indiquer l'element a inserer : 4
298 indiquer l'element a inserer : 5
301 indiquer l'element a inserer : 1
304 indiquer l'element a inserer : 0
317 indiquer l'element a rechercher : 4
321 indiquer l'element a rechercher : 3
325 indiquer l'element a supprimer : 4
337 indiquer le nom de fichier pour la sauvegarde : sauv.txt
340 indiquer le nom de fichier pour le chargement : sauv.txt
353 ******************************************************************************/