Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-04-2008, 21:27   #1
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
[JAVA] Algoritmo albero binario..!

Ragazzi ho provato a buttar giù un pò di codice x il metodo di visita dell albero ma nn riesco ad implementare il metodo ke ricevendo due Alberi binari restituisce true se tutti gli elementi dell'albero A sono presenti nell'Albero B...! potete dare un okkiata e darmi qualke consiglio con kodice?

Metodo di visita dell'Albero:
private void visita(AlberoB A,int livello,int i) {
if (i==livello) {
System.out.println(a.val());
return;
}
i++;
if (a.sin()!=null) {
visita(a.sin(),livello,i);
if (a.des()!=null) {
visita(a.des(),livello,i);
}
}
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 15-04-2008, 22:28   #2
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Penso che la procedura sia abbastanza semplice.
Partendo da un algoritmo per la visita ordinata, per ogni elemento esegui una ricerca con una funzione che ritorna true se l'elemento è presente nel secondo albero.
Se non viene mai riportato false, la tua funzione ritornerà true, altrimenti al primo false saprai che il predicato originario, ossia la presenza nel secondo albero di tutti gli elementi del primo, è senza dubbio falso
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 15-04-2008, 22:32   #3
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
e kome faccio??! Il primo albero lo devo mettere in una LinkedList e scorrerlo kon un iteratore?? La mia difficoltà è questa..! nn puoi buttare un pò di codice su questa funzione di verifica?
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 15-04-2008, 22:42   #4
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da stratosfe Guarda i messaggi
e kome faccio??! Il primo albero lo devo mettere in una LinkedList e scorrerlo kon un iteratore?? La mia difficoltà è questa..! nn puoi buttare un pò di codice su questa funzione di verifica?
Non conosco affatto il linguaggio Java, ma cercherò comunque di esprimere quello che è l'approccio che userei...

Anzitutto definire una struttura nodo, composta da un elemento, un puntatore al nodo di sinistra e un puntatore al nodo di destra (ovviamente nulli se non sono presenti nodi discendenti).

Poi, una funzione booleana in_albero che accetta come parametro un puntatore a struttura nodo: se il tuo albero è ordinato la funzione deve soltanto scorrere l'albero "svoltando" opportunamente a destra e a sinistra: quando e se incontra un puntatore nullo, significa che l'elemento non è presente.

Detto ciò, la nostra funzione di confronto deve semplicemente essere un ritocco a una classica funzione di visita ordinata, solitamente strutturata in maniera ricorsiva del tipo "Stampa a sinistra, mostra a schermo elemento, stampa a destra", dove stampa a... significa richiamare la funzione passando come parametro il puntatore al nodo di sinistra/destra.
La funzione opportunamento modificata accetta come parametro anche un secondo nodo principale e, al posto del "mostra a schermo elemento", esegue un in_albero (la funzione di ricerca di prima) passando come elemento l'elemento corrente del primo albero, e come albero il secondo albero in cui vogliamo verificare la presenza dell'elemento.

Penso che, conoscendo il linguaggio sicuramente meglio di me, non dovresti avere problemi a buttare giù il codice che ti serve
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 15-04-2008, 22:55   #5
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
Ok grazie mille!!! x fare questo metodo ho a disposizione le interfaccie int val() ke restituisce la radice dell albero; Albero sin() ke restituisce il sottoalbero di sinistra e Albero des(); gli alberi nn sono ordinati kmq..! Molte grazie..!! vediamo se riesko a farlo girare..!!
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 15-04-2008, 23:03   #6
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
Un ultima kosa!! La struttura Nodo la posso eliminare visto ke l esercizio mi da già quei metodi dell interfaccia ke ti ho scritto prima?
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 11:06   #7
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2776
Ma il testo dell'esercizio qual è? Da qualche parte la classe Nodo dovrebbe essere definita (penso sia definita nell'esercizio).
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 12:32   #8
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
Ekko la traccia :
Si consideri la seguente interfaccia che descrive alberi binari in cui la parte
informativa di ogni nodo sia un intero.
public interface AlberoBinario{
int val();
AlberoBinario sin();
AlberoBinario des();
}
Implementare il metodo
boolean maggiore(AlberoBinario a, AlberoBinario b);
che restituisce vero se e solo se tutti i valori contenuti nell’albero a sono contenuti
anche nell’albero b. (si ricorda che si possono implementare tutti i metodi di
appoggio che si ritiene utili per l’implementazione del metodo maggiore.
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 14:14   #9
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2776
Mmm quindi tu sai che un'implementazione di un albero binario ha sicuramente quei metodi e tu, sempre in quella implementazione, devi aggiungere il metodo maggiore. Giusto?
In quel caso puoi anche non tenere conto dell'esistenza dei nodi e fare tutto con quello che ti è stato fornito. Solo una cosa, visto che tutte le operazioni che dovrai eseguire nel metodo le farai sui due parametri puoi anche dichiarare il metodo static.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 15:11   #10
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
Si solo con quello ke mi è stato fornito..! Guarda io ti scrivo il codice ke ho generato io solo ke mi fa il confronto tra gli elementi dei due alberi nelle stesse posizioni..! io lo dovrei fare anke x posizioni diverse e nn mi viene..!! tu mi sai aiutare? intanto ti scrivo il codice :

static boolean maggiore(AlberoBinario a, AlberoBinario b) {
if (a!=null&&b!=null)
return true;
if (a.val()==b.val())
return true;
return maggiore(a.destro(),b.destro()) && maggiore(a.sinistro(),b.sinistro());
}
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 15:31   #11
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da stratosfe Guarda i messaggi
Si solo con quello ke mi è stato fornito..! Guarda io ti scrivo il codice ke ho generato io solo ke mi fa il confronto tra gli elementi dei due alberi nelle stesse posizioni..! io lo dovrei fare anke x posizioni diverse e nn mi viene..!! tu mi sai aiutare? intanto ti scrivo il codice :

static boolean maggiore(AlberoBinario a, AlberoBinario b) {
if (a!=null&&b!=null)
return true;
if (a.val()==b.val())
return true;
return maggiore(a.destro(),b.destro()) && maggiore(a.sinistro(),b.sinistro());
}
Se posso permettermi... segui il consiglio che ti e' stato dato, sia dal testo sia da qualcun altro, qui nel forum: spezza il problema.
1 - scrivi una funzione che controlla se un dato elemento e' presente in un albero binario;
2 - utilizza la funzione precedente, scandendo tutti gli elementi dell'albero di partenza, per vedere se sono presenti in quello di arrivo. Se non ne trovi almeno uno, ritorni false altrimenti true.

Le due funzioni, cosi' separate, sono semplicissime da realizzare
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 15:35   #12
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
Ma per vedere se l'elemento è presente in un albero come posso fare?? Devo passare uno dei due alberi ad una Lista?
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 15:50   #13
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da stratosfe Guarda i messaggi
Ma per vedere se l'elemento è presente in un albero come posso fare?? Devo passare uno dei due alberi ad una Lista?
No, dai!

Scrivi un metodo chiamato
boolean isNodeInTree (int v, AlberoBinario tree)

il quale fa una ricerca dell'elemento v nell'albero tree.
La ricerca e' semplicemente una visita all'albero. Immagino che ti abbiano gia' spiegato tanti algoritmi per la visita di un albero. Usa quello che ti piace di piu' oppure, se l'albero e' un albero binario di ricerca, puoi sfruttare la ricerca dicotomica ed essere piu' veloce (il tuo testo non specifica se sei in questa condizione).
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 15:59   #14
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
No nnè di ricerca..!! Posso usare la visita anticipata quindi..! la funzione ke mi hai scritto tu riceve come parametri l'intero v ke dovrebbe essere l'elemento di uno dei due alberi, giusto? ma se è kosi come faccio a passare l'intero se ho un albero?
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 16:04   #15
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
La funzione isNodeTree l ho fatta kosi..

boolean isNodeTree (int v,AlberoBinario tree) {
if (tree==null)
return false;
if (tree.val()==v)
return true;
return isNodeTree(tree.destro(),v)|| isNodeTree(tree.sinistro(),v);

è giusto?
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 18:00   #16
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2776
Quote:
Originariamente inviato da stratosfe Guarda i messaggi
La funzione isNodeTree l ho fatta kosi..

boolean isNodeTree (int v,AlberoBinario tree) {
if (tree==null)
return false;
if (tree.val()==v)
return true;
return isNodeTree(tree.destro(),v)|| isNodeTree(tree.sinistro(),v);

è giusto?
Sì è giusto. Hai fatto però un errore alla fine quando fai la chiamata ricorsiva, hai messo i parametri al contrario (ma te l'avrebbe detto anche il compilatore).
Anche questo metodo lo puoi dichiarare static.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 19:51   #17
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
Ok e fatto questo metodo ora come faccio a fare il metodo maggiore ke alla fine è quello ke mi serve? static boolean maggiore(AlberoBinario A,AlberoBinario B) {..} ..!
Devo fare la visita?
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 22:00   #18
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2776
Fai come ti hanno già detto: fai una visita di un albero (anticipata, posticipata... non importa) per ogni nodo che stai visitando richiami isNodeTree sull'altro albero, se questo torna false devi tornare false, altrimenti continui la visita. Se arrivi alla fine della visita torni true.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 22:10   #19
stratosfe
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 25
Quindi finendo st esercizio sarebbe kosi..!
static boolean presente (AlberoB albero,int v) {
if(albero==null)
return false;
if(albero.val()==v)
return true;
return presente(albero.destro(),v) || presente (albero.sinistro(),v);
}

static boolean maggiore (AlberoB A,AlberoB B) {
if (A==null && B==null)
return true;
return presente(A.sinistro(),B) || presente (A.destro(),B) || presente(A.val(),B);
return true;
}

è giusto? se nn lo è dove sbaglio?
stratosfe è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2008, 22:16   #20
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2776
Quote:
Originariamente inviato da stratosfe Guarda i messaggi
Codice:
static boolean maggiore (AlberoB A,AlberoB B) {
   if (A==null && B==null)
      return true;
   return presente(A.sinistro(),B) || presente (A.destro(),B) || presente(A.val(),B);
   return true;
}
è giusto? se nn lo è dove sbaglio?
Usa il tag CODE per favore.
Questo codice non ha senso perché:
1) Dov'è che fai la visita?
2) L'ultimo return che hai messo è irraggiungibile
3) A presente come secondo parametro devi passare un int, non un AlberoB
4) Hai provato a compilarlo? Avresti evitato i punti 2 e 3
wingman87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Elgato Embrace: una sedia ergonomica pro...
Brad Pitt torna in pista: F1 – Il Film a...
Hitachi Vantara annuncia la sua AI Facto...
Brembo passa all'alluminio riciclato al ...
HONOR pronta a sfidare gli iPad Pro con ...
OpenAI esce allo scoperto: confermati i ...
In arrivo altri due prodotti da Apple en...
Il tool per aggiornare da Windows 10 a W...
Rishi Sunak entra in Microsoft e Anthrop...
Porsche in poche ore chiude la formazion...
iPhone 17 disponibili su Amazon al prezz...
La Ferrari Elettrica non è la cau...
Ricarica da record: Zeekr supera i 1.300...
Un 'capezzolo' con feedback aptico al po...
Porsche Taycan Rush a Misano: prima al v...
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: 20:27.


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