Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1

    [C] Minimo in albero binario

    int minimo(int min, Tree T)
    { if (T!=null)
    { min = minimo(min,T.leftchild);
    if(min>T.element) min = T.element;
    min = minimo(min,T.rightchild);
    }
    return min;

    }


    Questo algoritmo trova ricorsivamente il minimo in un albero binario?
    Qualcuno mi saprebbe dare una soluzione (se esiste) a partire dalla signature
    int minimo(Tree T) ?

    P.s.: albero binario normale e tree è un nodo con due puntatori e l'elemento.

  2. #2
    codice:
    int minimo(Tree T) {
         int min_left,min_right,min;
         if (T!=NULL) {
              min_left=minimo(T.leftchild);
              min_right=minimo(T.rightchild);
              min=T.info;
              if (min_left<min)
                   min=min_left;
              if (min_right<min)
                   min=min_right;
              return min;
         }
         else
              return INT_MAX;
    }
    L'ho scritto di getto direttamente nel browser ma penso che la soluzione sia questa

  3. #3
    Originariamente inviato da doraemon83
    codice:
    int minimo(Tree T) {
         int min_left,min_right,min;
         if (T!=NULL) {
              min_left=minimo(T.leftchild);
              min_right=minimo(T.rightchild);
              min=T.info;
              if (min_left<min)
                   min=min_left;
              if (min_right<min)
                   min=min_right;
              return min;
         }
         else
              return INT_MAX;
    }
    L'ho scritto di getto direttamente nel browser ma penso che la soluzione sia questa
    Si ok era come l'avevo immaginato good.
    Quello che ho scritto io va bene cmq?

    E un'altra curiosità...cos'è quell INT_MAX? Restituisce 32milaecc..??

  4. #4
    da una prima occhiata sembrerebbe di si, ma nn posso darti certezza, non l'ho provato. Il modo migliore per verificare se una soluzione funziona è quello di testarlo in un tuo programma.

    Per INT_MAX essa è una costante definita se non sbaglio in stdlib.h (non vorrei sbagliare) che rappresenta il massimo intero rappresentabile sulla tua macchina (di solito è 32768 o giu di li )

  5. #5
    Utente di HTML.it L'avatar di giudf
    Registrato dal
    Jun 2006
    Messaggi
    162

    Credo non vada

    Io credo che non funzioni (anche se non l'ho provata) e ti spiego il perchè:

    Il valore min dovresti portartelo dietro per riferimento, altrimenti, min non cambia valore definitivamente, e quando la ricorsione va a ritroso, min assume i valori che aveva nelle chiamate precedenti "perdendo il valore minimo"

    P.S Ovviamente sto parlando del primo codice, quell'altro ad occhio, non mi piace tanto quell'assegnamento min = T.info, penso che in questo modo il min te lo perdi in ogni ciclo ricorsivo e ti restituisce sempre la radice, ma di questo non sono sicuro, potrei sbagliarmi!!!

  6. #6
    Utente di HTML.it L'avatar di eclips
    Registrato dal
    Apr 2005
    Messaggi
    48
    si e vero il min te lo perdi, perche ogni volta gli assegni T.info (che puo contentere un valore qualunque), un consiglio: di solito le variabili si inizializzano fuori dalle funzioni ricorsive oppure come in questo caso " fuori dall'if, cioè dentro la else".
    saluti

  7. #7

    Re: Credo non vada

    Originariamente inviato da giudf
    Il valore min dovresti portartelo dietro per riferimento, altrimenti, min non cambia valore definitivamente, e quando la ricorsione va a ritroso, min assume i valori che aveva nelle chiamate precedenti "perdendo il valore minimo"
    Qualcuno mi sa dare info a riguardo?


    P.s.: sinceramente non credevo fosse tanto complicato fare un algoritmo del genere... ma mai nessuno l'ha fatto? università,..per perdere tempo... niente?

  8. #8
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    Senza provarlo sembra che funzioni (cioè non si perdono valori)

    se il min. non è stato trovato nel sotto albero sinistro o in quello destro la funzione ricorsiva ritorna come valore min quello che gli era stato passato come parametro altrimenti gli ritorna quello modificato
    penso che sia importante solo inizializzare min alla prima chiamata della funzione minimo (..,..)con il valore della radice dell'albero


  9. #9
    dunque il principio secondo cui ho scritto quel codice è il seguente :

    suppongo che ogni sottoalbero restituisce il proprio minimo, per cui tramite le chiamate ricorsive ottengo min_left e min_right (che vengono restituiti tramite i return)

    Supponendo quindi di avere i minimi dei sottoalberi, il minimo dell'albero è dato dal valore piu piccolo tra il valore della radice e i minimi dei sottoalberi, per cui mi basta fare i confronti. se fate caso al codice, ho scritto :

    min=T.info //Per prima cosa suppongo che la radice abbia il minimo
    if (min_left<min) //Controllo che il minimo del sottoalbero sinistro sia minore della radice
    min=min_left; //se è vero allora min_left è il nuovo minimo
    if (min_right<min) //Controllo che il minimo del sottoalbero destro sia minore del minimo di prima
    min=min_right; //se è vero allora min_right è il nuovo minimo
    //Sei due controlli danno false entrambi allora il minimo è nella radice, quindi è gia in min
    return min; //Ritorno il valore minimo trovato, che alle chiamate precedenti sarà assegnato a min_left o a min_right

    Nel caso T sia NULL (cioè sono in una foglia) ritorno INT_MAX, che verrà assegnato a min_right o a min_left, per cui i controlli daranno sicuro un true.

    Anche se min è una variabile locale, essa viene ritornata alle chiamate precedenti tramite il return, quindi il suo valore non è perduto, ma assegnato a min_left e min_right. Quello che dite voi è il motivo per cui faccio prima le chiamate ricorsive e poi i controlli, in modo tale da avere i valori aggiornati quando si comincia a far backtracking.


    Scusate se mi sono dilungato, ma spero di essere stato chiaro. ciao ciao

  10. #10
    Scusate se mi intrometto...volevo sapere che tipo di albero è. Mi spiego, mi sembra
    di ricordare dai miei lontani anni in Università che un albero viene implicitamente ordinato,
    in quanto la posizione dove aggiungere il nuovo nodo la trovo con un confronto tra il
    valore da inserire e il valore del nodo corrente: se è minore lo aggiungo a sx altrimenti a
    dx.
    Se è così allora il valore minimo non dovrebbe essere semplicemente il valore del child
    più a sinistra dell'albero?
    Non si potrebbe cioè usare il codice:
    codice:
    int minimo(Tree *T) {
      if( !T )
        return MAX_INT;
      if( T->leftchild )
        return minimo(T->leftchild);
      else
        return T->info;
    }
    Magari si potrebbe anche evitare la ricorsione con:
    codice:
    int minimo_nr(Tree *T) {
      if( !T )
        return MAX_INT;
      while( T->leftchild )
        T = T->leftchild;
      return T->info;
    }
    Ho ovviamente supposto un albero definito così:
    codice:
      struct Tree
      {
         int info;
         Tree *leftchild;
         Tree *rightchild;
      };
    Se così non fosse allora non ho capito nulla (e quindi i miei ricordi si sono sbiaditi col tempo) e quindi fate finta che non abbia scritto niente.

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.