Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65

    [C ]dato un albero binario di ricerca copiarlo in un vettore RICORSIVAMENTE

    Salve a tutti. Ho il seguente problema dato un albero binario di ricerca lo devo copiare in maniera ricorsiva in un vettore in ordine crescente.
    codice:
    void copia(int vet[max],nod *rad, int i)
    {
      if (rad!=NULL) 
        {
         copia(vet,rad->sinistro,i);
         vet[i]=rad->info;   
         i=i+1;
         copia(vet,rad->destro,i);
        } 
    }
    dove max è una costante , rad è il puntatore dell albero e i è l indice del vettore.
    L OUTPUT mi copia solo i figli di destra. Spero qualcuno mi aiuti GRAZIE

  2. #2
    edit: niente scherzavo

  3. #3
    codice:
    void copia(int vet[max],nod *rad, int i)
    {
      if (rad!=NULL) 
        {
         copia(vet,rad->sinistro,i);
         vet[i]=rad->info;   
         i=i+1;
         copia(vet,rad->destro,i);
        } 
    }
    Con questo codice ti scorri tutti i rami di sinistra e non li salvi poi salvi quelli di destra e poi non fai nessun controllo se il vettore sia pieno.
    Prova con questo

    codice:
    void copia(int vet[max],nod *rad, int i)
    {
      if ((rad!=NULL) || (i < max))
        {
         vet[i]=rad->info;
         copia(vet,rad->sinistro,i++);
         vet[i]=rad->info;
         copia(vet,rad->destro,i++);
        } 
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    codice:
    void copia(int vet[max],nod *rad, int i)
    {
      if ((rad!=NULL) || (i < max))
        {
         vet[i]=rad->info;
         copia(vet,rad->sinistro,i++);
         vet[i]=rad->info;
         copia(vet,rad->destro,i++);
        } 
    }
    L ho provato in questo momento. Cosi facendo continua a copiari solo i rami di destra.

  5. #5
    Sei sicuro che il lato sinistro sia pieno ?
    Soprattutto se tra i nodi intermedi non ci siano nodi NULL

    Poi questa condizione
    codice:
    if ((rad!=NULL) || (i < max))
    cambiala in and perche' devono essere vere tutt'e due.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    allora se io ho un albero binario semplice ad esempio:
    4
    2 6 .
    cioe 4 nodo radice, 2 figlio sinistro di 4, e 6 figlio destro di 4. il vettore diventa 2 -6 -6.
    Pure mettendo l and tra le due condizioni(radice!=NULL && i<max)

  7. #7
    Il codice che ho scritto secondo me è giusto.

    Secondo me c'è un errore da qualche altra parte.

    Dopo che componi un albero, fai una funzione di prova che cicla sia il lato sinistro che il lato destro. Escono i valori giusti ?

    e poi com'è la struttura di nod ?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    14
    io lo farei così

    la funzione va chiamata con il terzo argomento come puntatore di un intero inizializzato a 0
    codice:
    void copia(int array[],nod *rad,int *i)
    {
    if (rad==NULL) return;
    copia(array,rad->sinistro,i);
    array[(*i)]=rad->info;
    (*i)=(*i)+1;
    copia(array,rad->destro,i);
    }
    è la prima volta che aiuto qualcuno in questo forum, anche se sono abbastanza sicuro possa andare bene

    nel codice che avevi postato tu, la i veniva incrementata solo prima di una chiamata al figlio destro... quindi tutti i figli sinistri venivano sovrascritti nella posizione 0

    cmq lolide, secondo me il codice che hai scritto è sbagliato per gli stessi motivi

    puoi ottimizzarla eliminando una riga, così:

    codice:
    void copia(int array[],nod *rad,int *i)
    {
    if (rad==NULL) return;
    copia(array,rad->sinistro,i);
    array[(*i)++]=rad->info;
    copia(array,rad->destro,i);
    }

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    guarda caro kafley. l ho appena provato ma va in loop. anche io avevo pensato all indice i passato con l asterisco ma va in loop. non so come fare

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    14
    Originariamente inviato da mame83
    guarda caro kafley. l ho appena provato ma va in loop. anche io avevo pensato all indice i passato con l asterisco ma va in loop. non so come fare
    faccio un po' di prove anch'io
    ma ti posso dire con certezza che l'unico motivo per cui potrebbe andare in loop è che non trova il NULL che dovrebbe trovarsi come figlio delle foglie

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 © 2024 vBulletin Solutions, Inc. All rights reserved.