|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
[C]trovare il minimo in un albero binario semplice
Ciao a tutti. Ho il seguente problema : devo cercare in un albero binario semplice(cioè non di ricerca)l elemento piu piccolo utilizzando una funzione ricorsiva.
Codice:
int minimo(nod *radice, int conf)
{
int min1,min2;
if (radice!=NULL)
{
if(radice->info<conf)
conf=radice->info;
min1=minimo(radice->sinistro,conf);
min2=minimo(radice->destro,conf);
if (min1>min2)
return min1;
else
return min2;
}
}
MIN1 e MIN2 sono due variabili che dovrebbero memorizzare il minimo di sinistro e il minimo di destra. Li confronto e il valore piu piccolo sarà il minimo dell albero. INVECE la funzione mi restitutisce un valore sballato. Spero che qualcuno mi aiuti grazie |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Qui ritorni il massimo. Ad ogni modo ti consiglio di rivedere l'algoritmo
__________________
In God we trust; all others bring data |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
L'algoritmo che hai fatto è fatto molto male.
Dai una condizione if, ma non ritorni nulla nel caso non si verifichi la condizione. così al volo potresti fare una cosa del tipo Codice:
int minimo(node *nd){
int min = nd.val;
se nd è foglia
return min
int tmp = 0;
//qui meglio distinguere alcuni casi
if ha entrambi i figli
int left = minimo(nd->left);
int right = minimo(nd->right);
tmp = valore più piccolo tra left e right
else se ha solo figlio sinistro
tmp = minimo(nd->left)
else
tmp = minimo(nd->right)
return valore più piccolo tra tmp e min
Codice:
int mini(node *nd){
if(nd == NULL)vedi te che vuoi ritornare
else return minimo(nd);
}
Il codice non l'ho provato ma dovrebbe funzionare ps tratta bene chi ti risponde anche se le risposte possono essere un po scontate... anche perchè è stato l'unico che ti ha risposto ed è stato anche quello che ti ha detto di riguardare il codice dato che comunque era sbagliato |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Codice:
int minimo (node *nd)
{
int l,r,m;
return (nd==NULL)?maxint:(((m=(((l=minimo(nd->left))<(r=minimo(nd->right)))?l:r)) < nd->radice) ? m : nd->radice);
}
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
questo messaggio è per tutti. Il codice l ho visto è rivisto tantissime volte senza riuscire a risolvere nulla. Quindi ho deciso di chiedere aiuto, se quindi ricevo come risposta di rivedere il codice è ovvio che una persona si arrabbia (senza offendere nessuno).
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Mio suggerimento: 1 - caso base: nd == NULL. Evita altri casi, altrimenti il codice diventa troppo lungo. Nel caso base ritorni il massimo intero disponibile 2 - se non e' il caso base: 2.1 - chiama ricorsivamente il minimo sul nodo sinistro (non hai bisogno di controllare che sia NULL) e memorizza il risultato nella variabile intera left; 2.2 - chiama ricorsivamente il minimo sul nodo destro e memorizza in right; 2.3 - ritorna il minimo fra left, right ed il contenuto della radice. le variabili locali ti servono perche' si tratta di un minimo fra tre variabili, che effettuerai a due a due (confronti i primi due elementi, ed il risultato con il terzo).
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
se entri nella funzione Codice:
int minimo(nodo *p){
if(p == NULL)return cosa?
......resto.....
}
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Nel caso non ti piaccia come soluzione (si, lo so, non ti piace Dopo di che: 1 - caso base: il nodo e' una foglia (i.e. entrambi i sottoalberi sono NULL). in tal caso, il minimo e' l'informazione contenuta nella radice. 2 - se il nodo sx non e' NULL, 2.1 - chiama ricorsivamente il minimo() e memorizza il risultato in left; 2.2 - calcola il minimo fra left ed la radice e memorizzalo in res_sx; Se il nodo sx e' NULL allora res_sx = radice; 3 - se il nodo dx non e' NULL, 3.1 - chiama ricorsivamente minimo() e memorizza il risultato in right; 3.2 - calcola il minimo fra right e la radice e memorizzalo in res_dx; Se il nodo dx e' NULL allora res_dx = radice; 4 - ritorna il minimo fra res_dx e res_sx; Mi piace di piu' ritornare il massimo intero
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
ho provato a farlo cosi mi sembra che funzioni
Codice:
int min(int a, int b, int c)
{
return a < b ? (a < c ? a : c) : (b < c ? b : c);
}
int tree_min(nod *radice)
{
/* arrivati alla fine */
if (radice == NULL)
return max;
/* nodo foglia */
if (radice->sinistro==NULL && radice->destro==NULL)
return radice->info;
return min(tree_min(radice->sinistro),tree_min(radice->destro),radice->info);
}
calcolo il minimo dal basso verso l alto tra sinistro destro e radice. Che ne pensate??? |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Volendo puoi anche eliminare il controllo del nodo foglia, e' gia' fatto nella ricorsione
__________________
In God we trust; all others bring data |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:37.




















