21/05/11 13:31
Puffetta
Ciao a tutti, devo creare un programma che preso in input un albero binario completo o semicompleto(se la foglia non c'è metto zero), mi stampa la sua visita preordine. Io ho fatto vari tentativi ma il programma va sempre in loop.
Potreste darmi una mano a risolvere questo problema? io programmo da poco e non so bene dove mettere le mani.
Il codice che ho fatto è il seguente:
Potreste darmi una mano a risolvere questo problema? io programmo da poco e non so bene dove mettere le mani.
Il codice che ho fatto è il seguente:
#include<stdio.h> #include<stdlib.h> #include<math.h> #define SIZE 31 int main() { int v[SIZE]; int i=0, padre=0, rad=0; scanf("%d",&(v[0])); scanf("%d %d", &(v[1]),&v[2]); scanf("%d %d %d %d", &(v[3]),&v[4], &v[5], &v[6]); scanf("%d %d %d %d %d %d %d %d", &(v[7]),&v[8], &v[9], &v[10], &(v[11]), &(v[12]), &(v[13]), &(v[14])); scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &(v[15]),&v[16], &v[17], &v[18], &(v[19]), &(v[20]), &(v[21]), &(v[22]), &(v[23]), &(v[24]), &(v[25]), &(v[26]), &(v[27]), &(v[28]), &(v[29]), &(v[30])); while(i<SIZE) { if((v[i]==0)&&(i<SIZE)) i=2*padre+2; if((v[i]!=0)&&(i<SIZE)) { printf("%d\n", v[i]); //Ho figlio sinistro? if((v[(2*i+1)]!=0)&&((2*i+1)<SIZE)) { padre=i; i=2*i+1; } else { //se non ho il figlio sinistro, ho il figlio destro? if((v[2*i+2]!=0)&&((2*i+2)<SIZE)) { padre=i; i=2*i+2; } //se non ho nessuno dei due cerco di tornare alla prima radice non nulla. else { i++; if((v[i]!=0)&&(i<SIZE)) printf("%d\n", v[i]); rad=(int)ceil(((double)padre)/2.-1.); if((2*i+1<SIZE)&&(2*i+2<SIZE)) { if((v[2*i+1]==0)&&(v[2*i+2]==0)) { i=2*rad+2; if(i==padre) { padre=(int)ceil(((double)rad)/2.-1.); i=2*padre+2; } } } else { i=2*rad+2; if(i==padre) { padre=(int)ceil(((double)rad)/2.-1.); i=2*padre+2; if(padre==1) i=padre++; } } } } } } system("PAUSE"); return 0; }
Ultima modifica effettuata da Puffetta 21/05/11 13:33
aaa