Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205

    [java] Livello nodi albero binario

    /************************************************** *********************
    TESTO DELL'ESERCIZIO
    Seguendo le indicazioni, completare il seguente metodo scriviLivelloNodi che elenca in un file tutti i
    nodi dell'albero su cui viene chiamato specificando per ciascuno il livello a cui si trova.
    L'oggetto File corrispondente al file su cui scrivere viene passato come paramentro al metodo.
    In tale file dovra' comparire pertanto un elenco nella forma
    (N1,L1)
    (N2,L2)
    (N3,L3)
    ...
    dove N1, N2, N3... sono gli interi contenuti nei nodi dell'albero, e Lx e' il livello a cui e' stato
    trovato il dato Nx.
    Per implementare il metodo richiesto ti sara' necessario aggiungere un altro metodo di supporto
    che si occupi di visitare l'albero ed eseguire per ciascun nodo le operazioni richieste. Si suggerisce
    di progettare tale metodo di supporto in modo ricorsivo.
    ************************************************** ***********************/
    public void scriviNelFile(File name,int nodo,int livello) {
    try {
    FileOutputStream file = new FileOutputStream(name);
    PrintStream Output = new PrintStream(file);
    Output.println("("+nodo+","+livello+")");

    }
    catch(FileNotFoundException e) {
    System.out.println("Errore scrittura sul file.txt!!"+e);
    }
    }



    public void scriviLivelloNodi(File name) {
    BinaryNode node = root;
    // Passo 1: apri il file in scrittura
    try {
    //apro file in scrittura
    FileWriter prova = new FileWriter(name);

    int nodo=0;
    int livello=-1;

    // Passo 2: chiama un opportuno metodo di supporto (che dovrai implementare) che si occupa di scrivere
    // nel file i dati richiesti per ciascun nodo dell'albero
    if(node.getLeftChild()!=null || node.getRightChild()!=null) {
    livello++;
    nodo=node.getDato();
    scriviNelFile(name, nodo,livello);
    }

    //Passo 3: chiudi il file
    prova.close();
    }
    catch(IOException e) {
    e.printStackTrace();
    }

    }

    domanda: perchè nel file txt vedo solamente il primo (nodo,livello)?

  2. #2
    Forse perchè nel codice non fai altro che invocare un'unica volta il metodo scriviNelFile()? Non vedo alcuna ricorsione.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205
    Originariamente inviato da satifal
    Forse perchè nel codice non fai altro che invocare un'unica volta il metodo scriviNelFile()? Non vedo alcuna ricorsione.
    ok, se modifico cosi:
    codice:
        
        public void scriviLivelloNodi(File name) {
            scriviLivelloNodi(root,name);
        }
        
        public void scriviLivelloNodi(BinaryNode node,File name) {
            //BinaryNode node = root;
            // Passo 1: apri il file in scrittura
            try {
                //apro file in scrittura
                FileWriter prova = new FileWriter(name);
    
                   int nodo=0;
                int livello=-1;
            
                // Passo 2: chiama un opportuno metodo di supporto (che dovrai implementare) che si occupa di scrivere
                // nel file i dati richiesti per ciascun nodo dell'albero
                if(node.getLeftChild()!=null || node.getRightChild()!=null) {
                    livello++;
                    nodo=node.getDato();
                    scriviNelFile(name, nodo,livello);
                    //visito l'albero a sx
                    scriviLivelloNodi(node.getLeftChild(),name);
                    //visito l'albero a dx
                    scriviLivelloNodi(node.getRightChild(),name);
    //non va bene...
                }
       
            
                
                //Passo 3: chiudi il file
                prova.close();
            }
            catch(IOException e) {
                e.printStackTrace();
                }

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Eviterei di portarmi dietro nel processo di esplorazione dell'albero l'apertura e la chiusura degli streams su file: apri uno stream prima di iniziare la visita e chiudilo quando l'hai finita. Se non vuoi memorizzare il FileWriter in un attributo puoi comunicarlo sotto forma di parametro ai metodi coinvolti.
    Il tuo metodo ora è ricorsivo, ma non nel modo corretto: perchè ogni volta il livello riparte da -1? Lo devi ricevere come parametro dal metodo chiamante e - per tutta l'esecuzione del metodo - fare riferimento a quello.
    Prova a rivedere la ricorsione... in caso di problemi possiamo tornare a discuterne

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205
    Originariamente inviato da desa
    Eviterei di portarmi dietro nel processo di esplorazione dell'albero l'apertura e la chiusura degli streams su file: apri uno stream prima di iniziare la visita e chiudilo quando l'hai finita. Se non vuoi memorizzare il FileWriter in un attributo puoi comunicarlo sotto forma di parametro ai metodi coinvolti.
    Il tuo metodo ora è ricorsivo, ma non nel modo corretto: perchè ogni volta il livello riparte da -1? Lo devi ricevere come parametro dal metodo chiamante e - per tutta l'esecuzione del metodo - fare riferimento a quello.
    Prova a rivedere la ricorsione... in caso di problemi possiamo tornare a discuterne
    codice:
       
     public void scriviNelFile(File name,int nodo,int livello) {
            try {
                FileOutputStream file = new FileOutputStream(name);
                PrintStream Output = new PrintStream(file);
                Output.println("(nodo, livello)");
                Output.println("("+nodo+","+livello+")");
    
                }
                catch(FileNotFoundException e) {
                    System.out.println("Errore scrittura sul file.txt!!"+e);
                }
        }
        
        public void scriviLivelloNodi(File name) {
            scriviLivelloNodi(root,name,0,-1);
        }
        
        public void scriviLivelloNodi(BinaryNode node,File name,int nodo, int livello) {
            // Passo 1: apri il file in scrittura
            try {
                //apro file in scrittura
                FileWriter prova = new FileWriter(name);
            
                // Passo 2: chiama un opportuno metodo di supporto (che dovrai implementare) che si occupa di scrivere
                // nel file i dati richiesti per ciascun nodo dell'albero
                if(node.getLeftChild()!=null || node.getRightChild()!=null) {
                    livello++;
                    nodo=node.getDato();
                    scriviNelFile(name, nodo,livello);
                    scriviLivelloNodi(node.getLeftChild(),name,nodo,livello);
                    scriviLivelloNodi(node.getRightChild(),name,nodo,livello);
                }            
            
                
                //Passo 3: chiudi il file
                prova.close();
            }
            catch(IOException e) {
                e.printStackTrace();
                }
                
            
            
                
        }
    Ho sistemato il livello mettendolo come parametro al metodo. però non so come fare la prima parte dove dici:
    Originariamente inviato da desa Eviterei di portarmi dietro nel processo di esplorazione dell'albero l'apertura e la chiusura degli streams su file: apri uno stream prima di iniziare la visita e chiudilo quando l'hai finita. Se non vuoi memorizzare il FileWriter in un attributo puoi comunicarlo sotto forma di parametro ai metodi coinvolti.

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Parto dalla fine (la questione FileWriter)...
    Non conosco la tua applicazione completa, nè so di preciso gli utilizzi che intendi farne... ma secondo me la soluzione migliore è che sia il metodo chiamante (che non hai postato) a creare un FileWriter e che i tuoi metodi ricevano un parametro di questo tipo, piuttosto che un oggetto File.
    In questi termini, io scriverei l'algoritmo così:

    codice:
    public void scriviNelFile(FileWriter fw, BinaryNode nodo, int livello)
    {
      try
      {
        if (livello == 0)
        {
          fw.write("(nodo, livello)");
        }
    
        fw.write("(" + nodo.getDato() + ", " + livello + ")");
      }
      catch (IOException exception)
      {
        System.out.println("Errore scrittura sul file! (" + exception.getMessage() + ")");
      }
    }
    
    public void scriviLivelloNodi(FileWriter fw)
    {
      scriviLivelloNodi(fw, root, 0);
    }
    
    public void scriviLivelloNodi(FileWriter fw, BinaryNode nodo, int livello)
    {
      if (nodo == null)
      {
        return;
      }
      else
      {
        scriviNelFile(fw, nodo, livello);
        
        scriviLivelloNodi(fw, nodo.getLeftChild(), livello + 1);
        scriviLivelloNodi(fw, nodo.getRightChild(), livello + 1);
      }
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205
    Originariamente inviato da desa
    Parto dalla fine (la questione FileWriter)...
    Non conosco la tua applicazione completa, nè so di preciso gli utilizzi che intendi farne... ma secondo me la soluzione migliore è che sia il metodo chiamante (che non hai postato) a creare un FileWriter e che i tuoi metodi ricevano un parametro di questo tipo, piuttosto che un oggetto File.
    In questi termini, io scriverei l'algoritmo così:

    codice:
    public void scriviNelFile(FileWriter fw, BinaryNode nodo, int livello)
    {
      try
      {
        if (livello == 0)
        {
          fw.write("(nodo, livello)");
        }
    
        fw.write("(" + nodo.getDato() + ", " + livello + ")");
      }
      catch (IOException exception)
      {
        System.out.println("Errore scrittura sul file! (" + exception.getMessage() + ")");
      }
    }
    
    public void scriviLivelloNodi(FileWriter fw)
    {
      scriviLivelloNodi(fw, root, 0);
    }
    
    public void scriviLivelloNodi(FileWriter fw, BinaryNode nodo, int livello)
    {
      if (nodo == null)
      {
        return;
      }
      else
      {
        scriviNelFile(fw, nodo, livello);
        
        scriviLivelloNodi(fw, nodo.getLeftChild(), livello + 1);
        scriviLivelloNodi(fw, nodo.getRightChild(), livello + 1);
      }
    }
    Ok! come chiamata del metodo nel mio main ho: scriviLivelloNodi(new File("livello.txt"));

  8. #8
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Allora, se deciderai di seguire il mio suggerimento, ti sarà sufficiente modificare l'istruzione di chiamata in

    codice:
    scriviLivelloNodi(new FileWriter("livello.txt"));

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205
    Originariamente inviato da desa
    Allora, se deciderai di seguire il mio suggerimento, ti sarà sufficiente modificare l'istruzione di chiamata in

    codice:
    scriviLivelloNodi(new FileWriter("livello.txt"));
    Ok Grazie Mille!!!!!!!

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.