|
begin process at 2008 07 05 07:13:58
Derniers logiciels
|
Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
ARBRE BINAIRE RÉCURISIVITÉ C
Information sur la source
Description
Création d'un arbre binaire, affichage, suppression d'un noeud...
Source
- /*******************************************************
- * Langage C TP6.2 10/12/2002 *
- * Ecrire les algorithmes traitant quelques opération *
- * concernant les arbres binaires ordonnés. *
- * *
- *******************************************************/
-
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
-
- typedef struct Arbre
- {
- int Noeud;
- struct Arbre * SAG;
- struct Arbre * SAD;
- } Arbre;
-
-
- AfficherArbreCroissant(Arbre * Racine)
- {
- if (Racine!=NULL)
- {
- AfficherArbreCroissant(Racine->SAG);
- printf("%d ",Racine->Noeud);
- AfficherArbreCroissant(Racine->SAD);
- }
- }
-
-
- Arbre * CreerNoeud(Arbre * Racine,int valeur)
- {
- if (Racine!=NULL)
- {
- if (Racine->Noeud>valeur)
- {
- Racine->SAG=CreerNoeud(Racine->SAG,valeur);
- }
- else
- {
- Racine->SAD=CreerNoeud(Racine->SAD,valeur);
- }
- }
- else
- {
- Racine=(Arbre *)malloc(sizeof(Arbre));
- Racine->Noeud=valeur;
- Racine->SAD=NULL;
- Racine->SAG=NULL;
- }
- return Racine;
- }
-
-
- AfficherArbre(Arbre * Racine)
- {
- if (Racine!=NULL)
- {
- printf("%d ",Racine->Noeud);
- if (Racine->SAD!=NULL || Racine->SAG!=NULL)
- {
- AfficherArbre(Racine->SAG);
- AfficherArbre(Racine->SAD);
- }
- }
- }
-
-
- EnregArbre(Arbre * Racine,char * NomFic)
- {
- int nb;
- FILE * fic;
- fic=fopen(NomFic,"at");
- if (Racine!=NULL)
- {
- nb=Racine->Noeud;
- fwrite(&nb,sizeof(int),1,fic);
- fclose(fic);
- if (Racine->SAD!=NULL || Racine->SAG!=NULL)
- {
- EnregArbre(Racine->SAG,NomFic);
- EnregArbre(Racine->SAD,NomFic);
- }
- }
- }
-
-
- Arbre * ChargerArbre(Arbre * Racine,char * NomFic)
- {
- int nb;
- FILE * fic;
- fic=fopen(NomFic,"rt");
- fread(&nb,sizeof(int),1,fic);
- while (!feof(fic))
- {
- Racine = CreerNoeud(Racine,nb);
- fread(&nb,sizeof(int),1,fic);
- }
- fclose(fic);
- return Racine;
- }
-
-
- AfficherArbreDecroissant(Arbre * Racine)
- {
- if (Racine!=NULL)
- {
- AfficherArbreDecroissant(Racine->SAD);
- printf("%d ",Racine->Noeud);
- AfficherArbreDecroissant(Racine->SAG);
- }
- }
-
-
- int Somme(Arbre * Racine)
- {
- int total=0;
- if (Racine!=NULL)
- {
- total=Somme(Racine->SAG);
- total+=Racine->Noeud;
- total+=Somme(Racine->SAD);
- }
- return total;
- }
-
-
- int CompteNoeud(Arbre * Racine)
- {
- int total=0;
- if (Racine!=NULL)
- {
- total=CompteNoeud(Racine->SAG);
- total++;
- total+=CompteNoeud(Racine->SAD);
- }
- return total;
- }
-
-
- Arbre * RechercheNoeud(Arbre * Racine, int valeur)
- {
- if (Racine!=NULL)
- {
- if (Racine->Noeud>valeur)
- {
- Racine=RechercheNoeud(Racine->SAG,valeur);
- }
- else
- {
- if (Racine->Noeud<valeur)
- {
- Racine=RechercheNoeud(Racine->SAD,valeur);
- }
- }
- return Racine;
- }
- }
-
-
- Arbre * OterNoeud(Arbre * Racine, int valeur)
- {
- Arbre * NoeudASupprimer;
- if (Racine->Noeud==valeur) // on a trouvé l'élément à supprimer
- {
- NoeudASupprimer=Racine;
- if (NoeudASupprimer->SAG==NULL) //si ya pa de SAG, on retourne SAD
- return NoeudASupprimer->SAD;
- else
- {
- Racine=NoeudASupprimer->SAG; //sinon on recherche dans SAG l'endroit pour insérer le SAD
- while (Racine->SAD!=NULL)
- {
- Racine=Racine->SAD;
- }
- Racine->SAD=NoeudASupprimer->SAD;
- return NoeudASupprimer->SAG;
- }
- free(NoeudASupprimer);
- }
- else
- {
- if (Racine->Noeud>valeur)
- {
- Racine->SAG=OterNoeud(Racine->SAG,valeur);
- }
- else
- {
- Racine->SAD=OterNoeud(Racine->SAD,valeur);
- }
- }
- return Racine;
- }
-
-
- int Menu()
- {
- int Choix;
- do
- {
- system("cls"); //efface l'écran
- printf(" ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
- printf(" º º\n");
- printf(" º Menu Principal º\n");
- printf(" º º\n");
- printf(" ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n");
- printf("\n 1- Ajouter un noeud");
- printf("\n 2- Afficher l'arbre");
- printf("\n 3- Afficher l'arbre dans l'ordre croissant");
- printf("\n 4- Afficher l'arbre dans l'ordre decroissant");
- printf("\n 5- Somme des noeuds");
- printf("\n 6- Nombre de noeuds");
- printf("\n 7- Rechercher un noeud");
- printf("\n 8- Enlever un noeud");
- printf("\n 9- Enregister l'arbre dans un fichier");
- printf("\n 10- Charger l'arbre \205 partir d'un fichier");
- printf("\n 11- Quitter\n");
- printf("\n\n\n\n\n\n\nChoix :");
- scanf("%d",&Choix);
- } while (Choix <1 || Choix >11);
- system("cls");
- return Choix;
- }
-
-
- main()
- {
- int valeur;
- int Choix;
- char * NomFic="Fic.txt";
- Arbre * Racine;
- Arbre * RepRecherche;
- Racine=NULL;
- Choix = Menu();
- while (Choix!=11)
- {
- if (Racine==NULL && Choix>1 && Choix <10)
- {
- printf("Vous devez d'abord saisir un arbre");
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- }
- else
- {
- switch (Choix)
- {
- case 1 : printf("Saisir un entier (0 pour finir la saisie) : ");
- scanf("%d",&valeur);
- while (valeur != 0)
- {
- Racine=CreerNoeud(Racine,valeur);
- printf("Saisir un entier (0 pour finir la saisie) : ");
- scanf("%d",&valeur);
- }
- break;
- case 2 : AfficherArbre(Racine);
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 3 : AfficherArbreCroissant(Racine);
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 4 : AfficherArbreDecroissant(Racine);
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 5 : AfficherArbreCroissant(Racine);
- printf("\nTotal : %d",Somme(Racine));
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 6 : AfficherArbreCroissant(Racine);
- printf("\nTotal : %d",CompteNoeud(Racine));
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 7 : printf("Saisir la valeur \205 rechercher : ");
- scanf("%d", &valeur);
- RepRecherche=RechercheNoeud(Racine,valeur);
- if (RepRecherche->Noeud==valeur)
- {
- printf("%d", RepRecherche->Noeud);
- }
- else
- {
- printf("Impossible de trouver la valeur recherch\202e");
- }
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 8 : printf("Saisir la valeur du noeud \205 supprimer : \n");
- scanf("%d",&valeur);
- Racine=OterNoeud(Racine,valeur);
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 9 : system("del Fic.txt");
- system("cls");
- EnregArbre(Racine,NomFic);
- printf("Arbre enregistr\202\n");
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- case 10 : Racine=ChargerArbre(Racine,NomFic);
- printf("Arbre charg\202\n");
- printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
- getch();
- break;
- }
- }
- Choix=Menu();
- }
- }
/*******************************************************
* Langage C TP6.2 10/12/2002 *
* Ecrire les algorithmes traitant quelques opération *
* concernant les arbres binaires ordonnés. *
* *
*******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Arbre
{
int Noeud;
struct Arbre * SAG;
struct Arbre * SAD;
} Arbre;
AfficherArbreCroissant(Arbre * Racine)
{
if (Racine!=NULL)
{
AfficherArbreCroissant(Racine->SAG);
printf("%d ",Racine->Noeud);
AfficherArbreCroissant(Racine->SAD);
}
}
Arbre * CreerNoeud(Arbre * Racine,int valeur)
{
if (Racine!=NULL)
{
if (Racine->Noeud>valeur)
{
Racine->SAG=CreerNoeud(Racine->SAG,valeur);
}
else
{
Racine->SAD=CreerNoeud(Racine->SAD,valeur);
}
}
else
{
Racine=(Arbre *)malloc(sizeof(Arbre));
Racine->Noeud=valeur;
Racine->SAD=NULL;
Racine->SAG=NULL;
}
return Racine;
}
AfficherArbre(Arbre * Racine)
{
if (Racine!=NULL)
{
printf("%d ",Racine->Noeud);
if (Racine->SAD!=NULL || Racine->SAG!=NULL)
{
AfficherArbre(Racine->SAG);
AfficherArbre(Racine->SAD);
}
}
}
EnregArbre(Arbre * Racine,char * NomFic)
{
int nb;
FILE * fic;
fic=fopen(NomFic,"at");
if (Racine!=NULL)
{
nb=Racine->Noeud;
fwrite(&nb,sizeof(int),1,fic);
fclose(fic);
if (Racine->SAD!=NULL || Racine->SAG!=NULL)
{
EnregArbre(Racine->SAG,NomFic);
EnregArbre(Racine->SAD,NomFic);
}
}
}
Arbre * ChargerArbre(Arbre * Racine,char * NomFic)
{
int nb;
FILE * fic;
fic=fopen(NomFic,"rt");
fread(&nb,sizeof(int),1,fic);
while (!feof(fic))
{
Racine = CreerNoeud(Racine,nb);
fread(&nb,sizeof(int),1,fic);
}
fclose(fic);
return Racine;
}
AfficherArbreDecroissant(Arbre * Racine)
{
if (Racine!=NULL)
{
AfficherArbreDecroissant(Racine->SAD);
printf("%d ",Racine->Noeud);
AfficherArbreDecroissant(Racine->SAG);
}
}
int Somme(Arbre * Racine)
{
int total=0;
if (Racine!=NULL)
{
total=Somme(Racine->SAG);
total+=Racine->Noeud;
total+=Somme(Racine->SAD);
}
return total;
}
int CompteNoeud(Arbre * Racine)
{
int total=0;
if (Racine!=NULL)
{
total=CompteNoeud(Racine->SAG);
total++;
total+=CompteNoeud(Racine->SAD);
}
return total;
}
Arbre * RechercheNoeud(Arbre * Racine, int valeur)
{
if (Racine!=NULL)
{
if (Racine->Noeud>valeur)
{
Racine=RechercheNoeud(Racine->SAG,valeur);
}
else
{
if (Racine->Noeud<valeur)
{
Racine=RechercheNoeud(Racine->SAD,valeur);
}
}
return Racine;
}
}
Arbre * OterNoeud(Arbre * Racine, int valeur)
{
Arbre * NoeudASupprimer;
if (Racine->Noeud==valeur) // on a trouvé l'élément à supprimer
{
NoeudASupprimer=Racine;
if (NoeudASupprimer->SAG==NULL) //si ya pa de SAG, on retourne SAD
return NoeudASupprimer->SAD;
else
{
Racine=NoeudASupprimer->SAG; //sinon on recherche dans SAG l'endroit pour insérer le SAD
while (Racine->SAD!=NULL)
{
Racine=Racine->SAD;
}
Racine->SAD=NoeudASupprimer->SAD;
return NoeudASupprimer->SAG;
}
free(NoeudASupprimer);
}
else
{
if (Racine->Noeud>valeur)
{
Racine->SAG=OterNoeud(Racine->SAG,valeur);
}
else
{
Racine->SAD=OterNoeud(Racine->SAD,valeur);
}
}
return Racine;
}
int Menu()
{
int Choix;
do
{
system("cls"); //efface l'écran
printf(" ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
printf(" º º\n");
printf(" º Menu Principal º\n");
printf(" º º\n");
printf(" ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n");
printf("\n 1- Ajouter un noeud");
printf("\n 2- Afficher l'arbre");
printf("\n 3- Afficher l'arbre dans l'ordre croissant");
printf("\n 4- Afficher l'arbre dans l'ordre decroissant");
printf("\n 5- Somme des noeuds");
printf("\n 6- Nombre de noeuds");
printf("\n 7- Rechercher un noeud");
printf("\n 8- Enlever un noeud");
printf("\n 9- Enregister l'arbre dans un fichier");
printf("\n 10- Charger l'arbre \205 partir d'un fichier");
printf("\n 11- Quitter\n");
printf("\n\n\n\n\n\n\nChoix :");
scanf("%d",&Choix);
} while (Choix <1 || Choix >11);
system("cls");
return Choix;
}
main()
{
int valeur;
int Choix;
char * NomFic="Fic.txt";
Arbre * Racine;
Arbre * RepRecherche;
Racine=NULL;
Choix = Menu();
while (Choix!=11)
{
if (Racine==NULL && Choix>1 && Choix <10)
{
printf("Vous devez d'abord saisir un arbre");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
}
else
{
switch (Choix)
{
case 1 : printf("Saisir un entier (0 pour finir la saisie) : ");
scanf("%d",&valeur);
while (valeur != 0)
{
Racine=CreerNoeud(Racine,valeur);
printf("Saisir un entier (0 pour finir la saisie) : ");
scanf("%d",&valeur);
}
break;
case 2 : AfficherArbre(Racine);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 3 : AfficherArbreCroissant(Racine);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 4 : AfficherArbreDecroissant(Racine);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 5 : AfficherArbreCroissant(Racine);
printf("\nTotal : %d",Somme(Racine));
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 6 : AfficherArbreCroissant(Racine);
printf("\nTotal : %d",CompteNoeud(Racine));
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 7 : printf("Saisir la valeur \205 rechercher : ");
scanf("%d", &valeur);
RepRecherche=RechercheNoeud(Racine,valeur);
if (RepRecherche->Noeud==valeur)
{
printf("%d", RepRecherche->Noeud);
}
else
{
printf("Impossible de trouver la valeur recherch\202e");
}
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 8 : printf("Saisir la valeur du noeud \205 supprimer : \n");
scanf("%d",&valeur);
Racine=OterNoeud(Racine,valeur);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 9 : system("del Fic.txt");
system("cls");
EnregArbre(Racine,NomFic);
printf("Arbre enregistr\202\n");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
case 10 : Racine=ChargerArbre(Racine,NomFic);
printf("Arbre charg\202\n");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAppuyez sur une touche pour retourner au menu principal");
getch();
break;
}
}
Choix=Menu();
}
}
Conclusion
Reste plus qu'a faire l'affichage par niveau
Sources de la même categorie
Commentaires
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | | | |
|
|
|