Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-12-2012, 11:45   #1
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
[C] albero 4 figli verificare se è un ABR considerando nodi a due a due

Ciao , ho il seguente problema in C: dato un albero definito in questo modo:
typedef struct nodo
{
int info;
struct nodo *left1;
struct nodo *left2;
struct nodo *right1;
struct nodo *right2;
} nod;

devo verificare se l abero è un ABR rispetto alla somma dei nodi left1 e left2 e alla somma dei nodi right1 e right2.

codice:

void visita(nod *radice, int *min, int *risp , int *somma)
{
if (radice != NULL)
{
visita(radice->left1,min,risp,somma);
*somma= *somma+radice->info;
visita(radice->left2,min,risp,somma);
if (radice->info != *somma)
*somma=radice->info+ *somma;
if (*min < *somma)
{
*min = *somma;
printf("\n aggiorniamo min %d \n",*min);

}
else
{
*risp = 1;
printf("aggiorniamo risp %d \n",*risp);
}
somma=0;
visita(radice->right1,min,risp,somma);
visita(radice->right2,min,risp,somma);
}
}

int isBst(nod *root)/*0 se abr 1 NO - FUNZIONE PRINCIPALE- */
{
int min = INT_MIN;
int ok = 0;
int somma = 0;
visita(root,&min,&ok,&somma);
printf("valore di ok e' %d \n",ok);
if (ok == 0)
return 0;
else
return 1;
}



La funzione prinicipale è isBst, all interno richiamo visita inizializzando min al minimo intero, somma e ok a 0.
In output mi restituisce sempre 1 cioe che non è un abr. Ragazzi non so piu come fare
Spero che qualcuno mi aiuti, grazie in anticipo
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2012, 15:36   #2
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
Spero di aver spiegato bene qual è il problema
. HELP HELP!!!!!!!!
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2012, 15:54   #3
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Ehm... mi sento un po' ignorante nel domandarlo... ma cos'è un ABR tree?
Intendi Albero Rosso-Nero (Red Black Tree)? Tra le varie sigle di alberi che ho studiato, l'ABR non mi dice nulla

edit: o intendi Albero Binario di Ricerca?
Comunque se il tuo albero è binario, perchè hai quattro puntatori ad altri nodi in ogni nodo (4 nodi figli?)?
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 08-12-2012 alle 16:02.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2012, 16:26   #4
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
per ABR si intende un albero binario di ricerca cioe i nodi che stanno a sinistra sono minori o uguali della radice e quelli di destra maggiore. Nel caso in questione i nodi left1+ left2 devono essere minori o uguali della radice e right1 + right2 maggiori della radice.
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2012, 09:54   #5
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Prova con le soluzioni di Nick Parlante(esercizi 13 e 14):

http://cslibrary.stanford.edu/110/BinaryTrees.html

Ovviamente devi adattare il codice alla struttura del tuo albero.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2012, 08:46   #6
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
ma io con un albero binario lo so fare . Con un albero a 4 figli è piu difficile
ALBERO BINARIO faccio in questo modo:
Codice:
int isBST2(nod *root, int min, int max)
{
  
  if (root == NULL) 
     return 0;
  
  if (root->info > min && root->info <= max &&
       isBST2(root->sinistro, min, root->info) == 0 &&
       isBST2(root->destro, root->info, max) == 0) 
     return 0;
  else 
     return 1;
}

int isBst(nod *root)/*0 se abr 1 NO*/
{
 if (isBST2(root,INT_MIN,INT_MAX) == 0)/*minimo intero e massimo intero gia
                                         assegnati di default*/
   {
    printf("l albero e' un ABR \n");
    return 0;
   } 
 else
   {
    printf("l albero non e' un ABR \n");
    return 1;  
   }
Come devo modificarlo in un albero a 4 figli???
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2012, 09:37   #7
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da mame83 Guarda i messaggi
ma io con un albero binario lo so fare . Con un albero a 4 figli è piu difficile
ALBERO BINARIO faccio in questo modo:
Codice:
int isBST2(nod *root, int min, int max)
{
  
  if (root == NULL) 
     return 0;
  
  if (root->info > min && root->info <= max &&
       isBST2(root->sinistro, min, root->info) == 0 &&
       isBST2(root->destro, root->info, max) == 0) 
     return 0;
  else 
     return 1;
}

int isBst(nod *root)/*0 se abr 1 NO*/
{
 if (isBST2(root,INT_MIN,INT_MAX) == 0)/*minimo intero e massimo intero gia
                                         assegnati di default*/
   {
    printf("l albero e' un ABR \n");
    return 0;
   } 
 else
   {
    printf("l albero non e' un ABR \n");
    return 1;  
   }
Come devo modificarlo in un albero a 4 figli???
Un albero a 4 figli non è un albero binario. Un albero binario è un albero con, al più, due figli. Il tuo è un albero m-ario(leggasi "emme ario" non "Mario") con m = 4.

Dunque la soluzione è semplice:

Codice:
int isBST (nod *root)
{
    return 0;
}
La funzione restituisce sempre false perché l'albero non è binario e, a maggior ragione, non può essere un albero binario(BST o ABR) di ricerca.

Scherzo, più tardi vedo come si può adattare il codice per il tuo caso.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2012, 10:06   #8
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
il problema è andare a considerare di volta in volta la somma dei nodi left1 e left2 e la somma dei nodi right1 e right2. PS magari fosse cosi facile return 0

Cmq a parte gli scherzi spero che qualcuno mi aiuti
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2012, 12:17   #9
mame83
Member
 
Iscritto dal: Nov 2010
Messaggi: 71
ragazzi vi prego non so piu cosa fare. qualcuno mi aiuti!!!!!!!!
mame83 è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2012, 14:45   #10
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Come ti ha risposto l'utente sopra, il tuo albero non è binario, e io oserei dire nemmeno di ricerca, in quanto non è definito un ordinamento sui nodi, ma su coppie di nodi. Un albero di ricerca con nodi che hanno fino a quattro figli, è per esempio l'albero 2-4, ma è strutturalmente molto diverso dal tuo.
Così su due piedi avrei abbozzato una cosa del genere, non uso C da tempo per cui non garantisco la sintassi
Codice:
bool isOk(*nodo){
	int left = 0, right = 0;
	if (nodo->left1 != NULL){
		left += nodo->left1->info;
		if (!isOk(nodo->left1))
			return false
	}
	if (nodo->left2 != NULL){
		left += nodo->left2->info;
		if (!isOk(nodo->left2))
			return false
	}
	if (nodo->right1 != NULL){
		right += nodo->right1->info;
		if (!isOk(nodo->right1))
			return false
	}
	if (nodo->right2 != NULL){
		right += nodo->right2->info;
		if (!isOk(nodo->right2))
			return false
	}
	if (right < left)
		return false
	else
		return true
}
Concettualmente dovrebbe fare i calcoli seguendo un attraversamento inorder, per ogni nodo calcola la somma dei sinistri e dei destri e se i sinistri sommano più dei destri, ritorna false che si propaga alla prima chiamata della funzione.
Prova a vedere se funziona, non dovrebbe essere molto distante dalla soluzione, penso
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 13-12-2012 alle 14:48.
demos88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Volvo avvia la produzione dei nuovi cami...
26 offerte Amazon da non perdere, da iPh...
Google Pixel 10 e 10a a 619€ e 399€: sco...
iPhone 18 Pro e 18 Pro Max prenotabili s...
Anche Sam Altman ha paura: ecco i due sc...
Perplexity Portable Computer arriva su W...
Se l'IA sostituisse il lavoro i salari r...
Fujitsu Monaka è pronto: 144 core...
Il dispositivo ultra compatto che trasfo...
Bonus colonnine 2026: dal 22 settembre d...
Revolut, una cartella "Italy" ...
Le auto connesse possono vendere i tuoi ...
E se i computer elaborassero le informaz...
NVIDIA non ci sta: "Non lasceremo che l'...
Gli Stati Uniti hanno armi in orbita: ar...
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: 15:07.


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