#include <stdlib.h>
#include <stdio.h>
typedef int TipoInfoAlbero;
struct nodoAlbero {
TipoInfoAlbero info;
struct nodoAlbero *destro, *sinistro;
};
typedef struct nodoAlbero NodoAlbero;
typedef NodoAlbero *TipoAlbero;
typedef TipoAlbero TipoElemCoda;
#include "code.c"
void Analizza(int n)
{
printf("%d ", n);
}
void VisitaPreordine(TipoAlbero a)
{
if (a != NULL) {
Analizza(a->info);
VisitaPreordine(a->sinistro);
VisitaPreordine(a->destro);
}
}
void VisitaPostordine(TipoAlbero a)
{
if (a != NULL) {
VisitaPostordine(a->sinistro);
VisitaPostordine(a->destro);
Analizza(a->info);
}
}
void VisitaLivelli(TipoAlbero albero)
{
TipoCoda coda;
TipoAlbero a;
InitCoda(&coda);
InCoda(&coda, albero);
while (!TestCodaVuota(coda)) {
OutCoda(&coda, &a);
if (a != NULL) {
Analizza(a->info);
InCoda(&coda, a->sinistro);
InCoda(&coda, a->destro);
}
}
}
TipoAlbero RicercaAlbero(TipoAlbero A, TipoInfoAlbero elem)
{
TipoAlbero posiz;
if (A == NULL)
posiz = NULL;
else if (elem == A->info)
posiz = A;
else if (elem < A->info)
posiz = RicercaAlbero(A->sinistro, elem);
else
posiz = RicercaAlbero(A->destro, elem);
return posiz;
}
void StampaAlbero(TipoAlbero a)
{
if (a == NULL) {
printf("()");
} else {
printf("( %d ", a->info);
StampaAlbero(a->sinistro);
StampaAlbero(a->destro);
printf(" )");
}
}
char LeggiParentesi(FILE *f)
{
char c;
c = fgetc(f);
while (c != '(' && c != ')')
c = fgetc(f);
return c;
}
TipoAlbero LeggiSottoAlbero(FILE *file_albero)
{
char c;
TipoInfoAlbero i;
TipoAlbero r;
c = LeggiParentesi(file_albero);
c = fgetc(file_albero);
if (c == ')')
return NULL;
else {
fscanf(file_albero, "%d", &i);
r = malloc(sizeof(NodoAlbero));
r->info = i;
r->sinistro = LeggiSottoAlbero(file_albero);
r->destro = LeggiSottoAlbero(file_albero);
c = LeggiParentesi(file_albero);
return r;
}
}
TipoAlbero LeggiAlbero(char *nome_file)
{
TipoAlbero result;
FILE *file_albero;
file_albero = fopen(nome_file, "r");
if (file_albero == NULL) {
printf("Errore in apertura del file %s\n", nome_file);
result = NULL;
} else {
result = LeggiSottoAlbero(file_albero);
fclose(file_albero);
}
return result;
}
void DeallocaAlbero(TipoAlbero a)
{
if (a != NULL) {
DeallocaAlbero(a->sinistro);
DeallocaAlbero(a->destro);
free(a);
}
}
int main (void)
{
TipoAlbero alb;
char nomefile[128];
TipoInfoAlbero elem;
printf("Immetti il nome del file contenente l'albero: ");
scanf("%s", nomefile);
alb = LeggiAlbero(nomefile);
StampaAlbero(alb);
printf("\nVisita in preordine: ");
VisitaPreordine(alb);
printf("\nVisita in postordine: ");
VisitaPostordine(alb);
printf("\nVisita per livelli: ");
VisitaLivelli(alb);
printf("\n");
do {
printf("Immetti un elemento da cercare nell'albero (-1 per terminare): ");
scanf("%d", &elem);
if (elem != -1)
if (RicercaAlbero(alb, elem))
printf("%d e` presente nell'albero\n", elem);
else
printf("%d NON e` presente nell'albero\n", elem);
} while (elem != -1);
DeallocaAlbero(alb);
return 0;
}