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

    [java]albero binario completo

    Salve,
    vorrei creare un metodo che mi dice se il mio albero è completo.
    completo: ogni nodo deve avere 2figli.
    io l'ho svolto così:
    codice:
      public boolean isComplete() 
      {
          return isComplete(root) > -2;
      }
    
      private int isComplete(Node nd) 
      {
      if (nd == null) 
      {
            return -2;
      }
      int c = (int) Math.pow(2,height(nd));
      int foglie = numFoglie();
      
      return c-foglie;
      }
    ma vorrei svolgerlo in modo da non percorre l'intero albero 2 volte, una volta per trovare l'altezza(height(nd)) e l'altra per trovare il numero di foglie(numFoglie())

    Potete darmi qualche indicazione?

  2. #2
    Non ho capito bene il tuo algoritmo.
    tuttavia, ammesso che tu possa usare la ricorsione, che ne dici del seguente codice ?

    codice:
    static boolean isComplete(Node nd){
    
       if(nd == null) 
         return true;
    
      if(nd.getNumChildren() != 2) 
         return false;
    
      return isComplete(nd.getFirstChild()) && isComplete(nd.getSecondChild());
    
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    205
    un albero è completo quando ogni suo nodo ha esattamente due figli.
    es:
    codice:
                           5
                      6          7
                   8     9   10   11

    non completo:
    codice:
                           5
                      6          7
                         9   10   11

    l'algoritmo da me sviluppato, dato che per essere completo un albero deve aver 2^altezza albero uguali al numero di foglie

    esempio 1: 2^2 == 4(foglie) completo
    esempio 2: 2^2 != 3(foglie) non completo

  4. #4
    Quello che dice Uccio87 è questo:

    Un albero vuoto (null) è completo

    Un albero non vuoto è completo se:

    1) i sottoalberi sx e dx sono completi
    2) ed hanno la stessa altezza

    Sulla base di questo Mr.Bloom il tuo esempio continua a funzionare ?

    Inoltre il metodo isComplete deve usare un solo metodo ricorsivo, in modo da calcolare allo stesso tempo altezza dell'albero o del sottoalbero esaminato

    Io farei così comunque in risposta ad Uccio87

    codice:
    public boolean isComplete() {
       return isComplete(root) > -2;
    }
    
    public boolean isComplete(Node nd) {
      int hl, hr;
      if (nd == null) return -1; // l'albero vuoto (== null) è completo
    
      hl = isComplete(nd.left);
      hr = isComplete(nd.right);
    
      if (hl != hr) return -2; // Se uno dei sotto alberi è null l'albero non è completo, e termino di esplorare l'albero
      else return 1 + Math.max(hl, hr); // Se l'altezza del sottoalbero sinistro è uguale all'altezza del sottoalbero di destra restituisco restituisco l'altezza dell'albero
    }
    Che ne dite ?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Originariamente inviato da SolidSnake4
    Che ne dite ?
    Che, magari, dovresti usare i tag CODE per il codice, altrimenti diventaq tutto ingarbugliato, perdendo formattazione ed indentazione.

    Ho aggiunto io i tag al tuo post.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Ah pardon, andavo di fretta e non ho usato i tag giusti

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.