|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
[C]funzione verificare se un albero binario è un abr
Ciao a tutti ho il seguente problema : dato un albero binario devo scrivere una funzione ricorsiva che restituisce 0 se l albero è un ABR , 1 se non lo è.
La soluzione che avevo pensato ma non riesco ad applicare è quella di utilizzare la visita in ordine e verificare se la successione è crescente. Quindi utilizzando una funzione dove gli passerò due parametri var1 e var2 e verifico di chiamata in chiamata se var1 è minore o uguale di var2 appena var1 è maggiore di var2 dovrei uscire e ritornare 1 se no vado avanti. Spero di essere stato chiaro nell esposizione del problema e che qualcuno mi aiuti GRAZIE!!!!!!!! Codice:
int ABR(nod *radice, int *b)/*0 se è un abr, 1 se non lo è*/
{
int confronto;
if (radice!=NULL)
{
confronto=ABR(radice->sinistro,&(radice->info));
printf("valore di radice e' %d \n",radice->info);
printf("valore di b e' %d \n",*b);
if (radice->info>(*b))
return 1;/*dobbiamo uscire visto che il precedente è minore del successivo*/
else
confronto=0; /*vado avanti*/
confronto=ABR(radice->destro,&(radice->info));
}
return confronto;
}
|
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
in output mi restituisce sempre 1 anke quando è un abr. qualcuno mi sa aiutare
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 2267
|
Codice:
class node{
public:
int info;
node* first;
node* second;
node(int i,node* f, node* s):info(i),first(f),second(s){}
};
bool testNode(node* n){
bool isOk = true;
if(n->first!=0)
isOk = n->first->info <= n->info;
if(n->second!=0)
isOk = isOk && n->info <= n->second->info;
return isOk;
}
bool testABR(node* root){
if(root == 0) return true;
return testNode(root) && testABR(root->first) && testABR(root->second);
}
Codice:
confronto=confronto || ABR(radice->destro,&(radice->info));
__________________
Concluso con:... |
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
Quote:
|
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 287
|
non basta fare una visita inorder e controllare che i valori siano sempre crescenti?
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
e questo che voglio. ma come posso fare??? dove sbaglio nella mia funzione?
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 287
|
io farei così:
void verifica(struct nodo *radice, int *max, int* abr) //se abr è 0 è un ABR { verifica(radice->sx,max,abr); int appoggio; if (radice!=NULL) { appoggio=radice->info; if (appoggio<max) *abr=1; *max=appoggio; } verifica(radice->dx,max,abr); } |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
scusa max lo inizializzo a 0 o ad un valore grande??
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 2267
|
Quando quoti un listato lungo di codice senza apportarne modifiche, fai così:
Quote:
In ogni caso il codice è in C++. In C sarebbe una cosa del genere: Codice:
struct node{
int info;
node* first;
node* second;
};
bool testNode(node* n){
bool isOk = true;
if(n->first!=0)
isOk = n->first->info <= n->info;
if(n->second!=0)
isOk = isOk && n->info <= n->second->info;
return isOk;
}
bool testABR(node* root){
if(root == 0) return true;
return testNode(root) && testABR(root->first) && testABR(root->second);
}
Quindi per avere i valori che vuoi tu basta che fai !testABR(radice), così ti ritorna 0 (false) se è ABR e 1 (true) se non lo è. Per il resto è una normale visita ricorsiva infissa dell'albero. Facendo così eviti di dover utilizzare variabili ausiliarie. Inoltre la cortocircuitazione dell'operatore && garantisce che appena viene trovato un valore che non rispetta la definizione di ABR, la ricorsione si chiude. (nel caso non sapessi cosa significa che l'operatore binario && è cortocircuitato, significa che se si ha A && B, all'atto della valutazione se A è true allora viene valutato anche B, mentre se A è false allora B non viene valutato poichè A && B è in ogni caso false. Stessa cosa per l'operatore binario ||) Se vuoi una visita prefissa, basta porre: Codice:
return testABR(root->first) && testNode(root) && testABR(root->second);
__________________
Concluso con:... Ultima modifica di Floris : 21-09-2011 alle 21:07. |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Aug 2009
Messaggi: 287
|
|
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
Quote:
ho inizializzato nel main max e abr a 0 Codice:
void verifica(struct nodo *radice, int *max, int* abr) //se abr è 0 è un ABR
{
verifica(radice->sinistro,max,abr);
int appoggio;
if (radice!=NULL)
{
appoggio=radice->info;
if (appoggio<*max)
*abr=1;
*max=appoggio;
}
verifica(radice->destro,max,abr);
}
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:01.




















