Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    21

    Ricerca nodo in albero non ordinato

    Ciao a tutti sono nuovo del forum e spero di scrivere nella sezione giusta.
    Il mio problema è il seguente:
    Devo creare un metodo ricerca in un albero non ordinario non binario.
    Ho due classi NodoPFFS ( che crea gli oggetti nodo) e una classe AlberoPFFS (che crea l'albero)
    Nella classe nodo ho solo un puntatore al padre, uno al primo figlio e uno al fratello di destra. La classe è al seguente:


    public class NodoPFFS {

    private int data;
    private NodoPFFS figlio;
    private NodoPFFS fratello;
    private NodoPFFS padre;

    public NodoPFFS(int a) {
    data = a;
    figlio = null;
    fratello = null;
    padre = null;
    }

    public NodoPFFS() {

    }

    public void setfiglio(NodoPFFS c) {
    figlio = c;
    }

    public void setpadre(NodoPFFS a) {
    padre = a;
    }

    public void setfratello(NodoPFFS d) {
    fratello = d;
    }

    public void setdata(int b) {
    data = b;
    }

    public NodoPFFS getfiglio() {
    return figlio;
    }

    public NodoPFFS getfratello() {
    return fratello;
    }

    public int getdata() {
    return data;
    }

    public NodoPFFS getpadre() {
    return padre;
    }

    }

    Ora vorrei creare una metodo in AlberoPFFS che mi permetta di ricercare un determinato nodo partendo da un numero(int) ( in sostanza il data di nodo). Come posso fare? Grazie per le eventuali risposte!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Ricerca nodo in albero non ordinato

    Originariamente inviato da ittaglia
    Ora vorrei creare una metodo in AlberoPFFS che mi permetta di ricercare un determinato nodo partendo da un numero(int) ( in sostanza il data di nodo). Come posso fare?
    E cosa ha AlberoPFFS come punto di partenza? Un primo NodoPFFS (da cui partono i fratelli ognuno con figli che hanno fratelli ecc....)?

    Alla fin fine comunque è una semplice ricerca "in profondità" (da fare ad esempio con la tecnica della ricorsione). Da un nodo puoi andare ad un fratello o ad un figlio. L'ordine di visita lo puoi scegliere tu (se non ti è stato suggerito/imposto già). Ma devi comunque scansionare tutti i fratelli, per ognuno i figli, di cui per ognuni i fratelli, ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    21

    Re: Re: Ricerca nodo in albero non ordinato

    Originariamente inviato da andbin
    E cosa ha AlberoPFFS come punto di partenza? Un primo NodoPFFS (da cui partono i fratelli ognuno con figli che hanno fratelli ecc....)?
    Si scusa... la classe AlberoPFFS ha una radice che è di tipo NodoPFFS

    public class AlberoPFFS {
    private NodoPFFS radice;
    private int Nnodi;

    public AlberoPFFS() {
    radice = null;
    Nnodi = 0;
    }

    public void setRadice(int b) {
    radice.setdata(b);

    }


    Per fare una ricerca in profondità come di ci te dovrei fare così?

    public NodoPFFS ricerca(int a) { //numero del nodo da cercare
    ma poi come continuo? non mi è molto chiara il tipo di ricerca che dovrei fare

    }

    Scusa se ti assillo, cmq non ho nessuna imposizione sul tipo di ricerca da fare...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Ricerca nodo in albero non ordinato

    Originariamente inviato da ittaglia
    la classe AlberoPFFS ha una radice che è di tipo NodoPFFS

    codice:
    public class AlberoPFFS {
    	private NodoPFFS radice;
    Benissimo, come immaginavo.

    Allora un esempio di albero con dei nodi potrebbe essere questo:



    L'albero ha il riferimento ad un nodo "radice", che tecnicamente può avere, come tutti gli altri, un figlio e un fratello.
    Le frecce indicano proprio i riferimenti che sono esprimibili nella classe NodoPFFS. Le frecce verso destra sono verso il fratello, le frecce verso il basso sono verso il figlio, le frecce verso l'alto sono verso il padre.
    Dove mancherebbe una freccia è ovviamente perché il nodo non ha un figlio/fratello/padre.

    Concettualmente si potrebbe stare a discutere se tutti i fratelli correlati tra di loro devono avere tutti il riferimento al padre o il padre ce l'ha solo il primo fratello. Dipende da come deve essere gestito il tutto.

    Originariamente inviato da ittaglia
    Per fare una ricerca in profondità come di ci te dovrei fare così?

    public NodoPFFS ricerca(int a) { //numero del nodo da cercare
    Questo sì certo, è indubbiamente il metodo "pubblico" principale che si invoca sull'albero. Ma poi dovresti avere almeno un metodo privato che usa anche la ricorsione (invoca sé stesso).

    Quindi ricerca() invoca es. ricercaInterna() passando il nodo radice e il valore cercato.
    ricercaInterna() ha quindi un "nodo" e potrebbe fare la seguente cosa: itera sui nodi allo stesso livello (i fratelli) compreso il primo che il metodo riceve e per ognuno invoca sé stesso passando quel nodo.
    Appena, ad un certo livello di ricorsione, si trova il dato, si ritorna il nodo, altrimenti o si va avanti nella scansione o si ritorna null.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    21
    ok.. ho capito come va implementato.. cerco di metterlo in pratica.. grazie mille per la tua disponibilità..
    Grazie ancora

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    21
    Scusa se ti stresso la vita... ma cosi potrebbe andare bene? Quello che non mi torna è come fa interrompere la iterazione quando si incontra la fine di un nodo ma non sono stati scannerizzati tutti.



    public NodoPFFS ricerca(int a) {
    NodoPFFS nodoRic = radice;
    if (radice.getdata() == a) {
    return nodoRic;
    } else {
    nodoRic = nodoRic.getfiglio();
    }
    nodoRic = ricercaHelp(a, nodoRic);
    return nodoRic;
    }

    public NodoPFFS ricercaHelp(int a, NodoPFFS nodo) {
    if(nodo == null){ // questo non mi torna molto bene... come faccio ad interrompere l'iterazione?
    return null;
    }
    if (nodo.getdata() == a) {
    return nodo;
    }
    ricercaHelp(a, nodo.getfiglio());
    ricercaHelp(a, nodo.getfratello());
    return null;
    }



    grazie per la tua attenzione

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ittaglia
    ma cosi potrebbe andare bene? Quello che non mi torna è come fa interrompere la iterazione quando si incontra la fine di un nodo ma non sono stati scannerizzati tutti.
    Innanzitutto, se ci pensi bene, ricerca() potrebbe semplicemente e solamente invocare subito ricercaHelp(), perché puoi generalizzare il tutto lì dentro. Cioè il fatto che il nodo radice abbia pure lui il dato ... non è diverso dal resto dei nodi!

    Poi prima volevo quasi suggerirtelo ma vedo che lo hai già fatto tu. Trattare cioè il fratello allo stesso modo del figlio. In pratica ci sono 2 "direzioni" e si può appunto andare in ricorsione in entrambe le direzioni.

    In ricercaHelp() il test iniziale per null e il return del null sono ok. Quello che ti è sfuggito ancora è il fatto che chi ha invocato il ricercaHelp() (a parte ricerca() ) è sempre ricercaHelp!! E sono appunto le due invocazioni che fai al fondo. Ma alla prima invocazione che ritorna != null, devi ritornare subito quel nodo. Ecco quale è il punto nel "interrompere" la ricerca (e quindi non andare più a fondo nella visita di altri nodi).

    Appena si trova il nodo, si restituisce indietro quel nodo e si va a ritroso sullo stack delle chiamate. Pertanto ad ogni livello più superiore si vedrà che un nodo != null è stato trovato e quindi si ritorna subito indietro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    21
    Sono ancora io .....
    Io ho scritto cosi...

    public NodoPFFS ricerca(int a) {
    NodoPFFS nodoRic = ricercaHelp(a, radice);
    return nodoRic;
    }

    public NodoPFFS ricercaHelp(int a, NodoPFFS nodo) {
    if(nodo == null){
    return null;
    }
    if (nodo.getdata() == a) {
    return nodo;
    }
    ricercaHelp(a, nodo.getfiglio());
    ricercaHelp(a, nodo.getfratello());
    }

    Però andando in debug ho visto che non esce finché non arriva all'ultimo return null... come faccio ad interrompere subito appena lo trovo? non capisco... appena faccio il return nodo non dovrebbe interrompersi subito?
    Scusa ancora per il disturbo e grazie mille per l'enorme mano che mi stai dando

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ittaglia
    come faccio ad interrompere subito appena lo trovo?
    Riporto quello che ho scritto prima:

    Originariamente inviato da andbin
    Ma alla prima invocazione che ritorna != null, devi ritornare subito quel nodo. Ecco quale è il punto nel "interrompere" la ricerca (e quindi non andare più a fondo nella visita di altri nodi).

    Appena si trova il nodo, si restituisce indietro quel nodo e si va a ritroso sullo stack delle chiamate. Pertanto ad ogni livello più superiore si vedrà che un nodo != null è stato trovato e quindi si ritorna subito indietro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    21
    scusami, dammi pure del cretino... ma non ho capito in che modo farlo... le parole "Ma alla prima invocazione che ritorna != null, devi ritornare subito quel nodo. Ecco quale è il punto nel "interrompere" la ricerca (e quindi non andare più a fondo nella visita di altri nodi)." Non basta un return per interrompere il ciclo? prova a spiegarmelo con altre parole o magari un esempio... Scusa se ti rompo ancora...sono di legno...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.