/* Creare un programma C che legga da stdin un albero binario in postordine e lo stampi in preordine secondo la seguente formattazione: <# figli> Ad es. l'input: - - - - - - - - - 1 1 1 0 0 0 Io Papā 0 0 Zio Nonno - - - - - - - - - - produrrā l'output: - - - - - - - - - - Nonno 2 Papā Zio Papā 1 Io Io 0 Zio 0 - - - - - - - - - - */ #include #include #include #define SZ 50 typedef struct nodo { char val[SZ]; struct nodo * sx; struct nodo * dx; } Nodo; Nodo * leggiAlbero(); void stampaAlbero(Nodo * albero); int main(int argc, char *argv[]) { Nodo * albero = NULL; albero = leggiAlbero(); stampaAlbero(albero); return 1; } Nodo * leggiAlbero() { int esisteSx = 0; int esisteDx = 0; int i = 0; Nodo * radice = (Nodo *)malloc(sizeof(Nodo)); radice->sx = NULL; radice->dx = NULL; for (i = 0; i < SZ; i++) radice->val[i] = 0; // POSTORDINE /* leggo i flag che indicano se esistono i sottoalberi SX e DX */ scanf("%d %d",&esisteSx,&esisteDx); /* se esiste il sottoalbero SX lo leggo */ if (esisteSx) radice->sx = leggiAlbero(); /* se esiste il sottoalbero DX lo leggo */ if (esisteDx) radice->dx = leggiAlbero(); // leggo la radice scanf("%s",&(radice->val)); return radice; } void stampaAlbero(Nodo * albero) { /* non faccio nulla se l'albero č vuoto */ if (!albero) return; // PREORDINE // stampo la radice, il # dei figli, l'etichetta dei figli if ((albero->sx->val) != NULL && (albero->dx->val) != NULL) printf("%s 2 %s %s\n",albero->val, albero->sx->val, albero->dx->val); else if ((albero->sx->val) != NULL && (albero->dx->val) == NULL) printf("%s 1 %s\n",albero->val, albero->sx->val); else if ((albero->sx->val) == NULL && (albero->dx->val) != NULL) printf("%s 1 %s\n",albero->val, albero->dx->val); else if ((albero->sx->val) == NULL && (albero->dx->val) == NULL) printf("%s 0\n",albero->val); /* stampo il sottoalbero sinistro */ stampaAlbero(albero->sx); /* stampo il sottoalbero destro */ stampaAlbero(albero->dx); }