Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16-ak0001nl combina RTX 5080 Laptop e Ryzen AI 9 HX 375 in un desktop replacement potente e ben raffreddato, con display 240 Hz e dotazione completa. Autonomia limitata e calibrazione non perfetta frenano l'entusiasmo, ma a 2.609 euro è tra le proposte più interessanti della categoria.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-09-2011, 10: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, 18: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, 19: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, 03: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, 10: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, 13: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, 13: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, 17: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, 20: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, 20: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 21:07.
Floris è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2011, 20: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, 10: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


Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
Microsoft sta cancellando la campagna Th...
Su Haul se spendi oltre 50€ c'è il 40% d...
Roborock non si ferma più: &egrav...
Amazon, -20% extra su migliaia di prodot...
Firefox per Windows 7 sarà suppor...
La nuova Xiaomi SU7 è pronta: nuo...
Gli agenti IA di Google entrano in servi...
Sconti sulle low cost: 2 scope elettrich...
DDR5 oltre i 10.000 MT/s: ecco le schede...
Questi elettrodomestici vanno a ruba su ...
Il trailer di lancio di Crimson Desert m...
Auto elettriche più economiche? I...
Le 10 offerte di Primavera Amazon su cui...
Amazon svende i robot aspirapolvere: Dre...
L'ex capo di Windows ha elogiato il MacB...
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:48.


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