Torna indietro   Hardware Upgrade Forum > Software > Programmazione

CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
La prima tappa italiana della Road to CES porta a Milano i vertici della Consumer Technology Association, con una nuova griglia di lettura dei trend tecnologici e una posizione netta su dazi e regolamentazione dell'IA
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
OPPO ha appena lanciato sul mercato la nuova serie Find X10, che ha come smartphone premium il Find X10 Pro Max, uno smartphone completo, che fa del comparto fotografico il suo vero punto di forza. Ma sono tante le novità, tra cui l'AI che adesso diventa agentica. Ma andiamo a vedere nel dettaglio questo nuovo smartphone.
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato
Abbiamo provato la beta di World of Warcraft: Forever, il Classic+ di Blizzard in arrivo il 4 novembre: la nuova razza Skyborne restituisce la sensazione di un gioco nuovo, ma le zone storiche conservano la noia divertita di Classic. Classi ribilanciate, sciamani anche nell'Alleanza e un motore grafico che in 4K gira bene anche su una RTX 3070. Cosa cambia in Forever? La risposta nell'articolo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-09-2011, 09:50   #1
mame83
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; 
 
}
B lo inizializzo nel main con un valore piu grande che non posso mai inserire nell albero.
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2011, 17:08   #2
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
ragazzi vi prego aiutatemi!!!!!!!
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 20-09-2011, 18:07   #3
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
in output mi restituisce sempre 1 anke quando è un abr. qualcuno mi sa aiutare
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 02:27   #4
Floris
Senior Member
 
L'Avatar di Floris
 
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);
}
Credo che nel tuo codice l'errore sia alla fine dove dovresti porre
Codice:
confronto=confronto || ABR(radice->destro,&(radice->info));
__________________
Concluso con:...
Floris è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 09:40   #5
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
Quote:
Originariamente inviato da Floris Guarda i messaggi
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);
}
Credo che nel tuo codice l'errore sia alla fine dove dovresti porre
Codice:
confronto=confronto || ABR(radice->destro,&(radice->info));
Scusa la mia ignoranza in materia. ma il codice che hai scritto non l ho capito. non è C vero?
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 12:00   #6
EnergyVortex
Member
 
Iscritto dal: Aug 2009
Messaggi: 287
non basta fare una visita inorder e controllare che i valori siano sempre crescenti?
EnergyVortex è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 12:16   #7
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
e questo che voglio. ma come posso fare??? dove sbaglio nella mia funzione?
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 16:14   #8
EnergyVortex
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);
}
EnergyVortex è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 19:11   #9
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
scusa max lo inizializzo a 0 o ad un valore grande??
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2011, 19:51   #10
Floris
Senior Member
 
L'Avatar di Floris
 
Iscritto dal: Jan 2007
Messaggi: 2267
Quando quoti un listato lungo di codice senza apportarne modifiche, fai così:
Quote:
Originariamente inviato da Floris
Codice:
class node{
	public:
		int info;
...
Per non rendere il thread dispersivo.

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);
}
Inoltre vengono usati i valori booleani. true equivale a 1 e false a 0. Il test n->first!=0 equivale a n->first!=NULL.
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 20:07.
Floris è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2011, 19:59   #11
EnergyVortex
Member
 
Iscritto dal: Aug 2009
Messaggi: 287
Quote:
Originariamente inviato da mame83 Guarda i messaggi
scusa max lo inizializzo a 0 o ad un valore grande??
a 0 se l'albero contiene solo valori positivi, altrimenti al massimo numero negativo rappresentabile con un int
EnergyVortex è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2011, 09:58   #12
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
Quote:
Originariamente inviato da EnergyVortex Guarda i messaggi
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);
}
L ho provato a fare come dici. ma va in loop.
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);
}
mame83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato WoW Forever provato: il MMORPG che la community ...
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita TCL P80 Ultra: con un display AMOLED opaco &egra...
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
Niente più faccende domestiche e piatti ...
Proiettore WiMiUS G2 in offerta su Amazo...
Terre rare e semiconduttori: TSMC valuta...
Cani potenziati con l'ingegneria genetic...
Spento Arc Browser: The Browser Company ...
Ferrari Luce costa 560.800 dollari negli...
Sony annuncia le nuove cuffie wireless P...
1Password for Agents: l'agente AI entra ...
Huang: niente surplus di memoria prima d...
L'IA di Microsoft centra l'83% delle dia...
Oral-B iO in offerta su Amazon: spazzoli...
Samsung porta i Galaxy ricondizionati su...
RTX 5090 rubate all'aeroporto di San Pao...
Urlife sfida tutti nelle e-bike: 560€ qu...
Claude ha trovato 493 problemi di superf...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v