C Algoritmo sugli alberi

di il
9 risposte

C Algoritmo sugli alberi

Ciao a tutti...ho un problema..vorrei creare una procedura ricorsiva che memorizzi, tramite una visita simmetrica, gli elementi di un albero in un array....qualcuno potrebbe darmi una mano??

Esempio:

20
/ \
10 40
/ \ / \
7 15 30 50
/
22


| 7 | 10 | 15 | 20 | 22 | 30 | 40 | 50 |


grazie in anticipo per l'aiuto!

9 Risposte

  • Re: C Algoritmo sugli alberi

    Ciao,
    come da regolamento dovresti proporre le tue idee e il tuo codice.

    PS. Comunque non è difficile: quando hai la procedura per la visita, anziché stampare un elemento lo memorizzi nell'array. Per quanto riguarda la dimensione dell'array puoi
    1. fare una prima passata per contare gli elementi e poi fare una seconda passata per memorizzarli
    2. fare tutto dinamicamente
  • Re: C Algoritmo sugli alberi

    Hai ragione scusami!
    l algoritmo della visita é:

    visita(tree){

    visita(tree->left);

    stampa elemento;

    visita(tree->right);

    }

    io pensavo di modificarlo sostituendo stampa elemento con una memorizzazione in un array...la mia difficoltà però è quella di stabilire in quale posizione dell array memorizzare l'elemento!
  • Re: C Algoritmo sugli alberi

    Mi daresti un aiuto su come farlo in maniera dinamica??
  • Re: C Algoritmo sugli alberi

    riccac ha scritto:


    la mia difficoltà però è quella di stabilire in quale posizione dell array memorizzare l'elemento!
    Aumenta ad ogni iterazione: inizi con una variabile
    int posiz_array = 0;
    Poi, ogni volta che memorizzi un valore fai
    mio_array[posiz_array++] = valore_preso_da_albero;
    In questa maniera "posiz_array" aumenta di 1 e all'iterazione successiva il valore verrà memorizzato nella posizione seguente.
  • Re: C Algoritmo sugli alberi

    Secondo me la soluzione che mi hai scritto non funziona....cioè posiziona la radice nella cella di indice zero, che è corretta solamente nel caso in cui l'albero non abbia discendenti nella parte sinistra...correggimi se sbaglio
  • Re: C Algoritmo sugli alberi

    Al posto di stampare gli elementi a video li inserisce nell'array. Quindi se la tua visita ti stampa gli elementi in ordine crescente (come succede con la visita "in ordine") allora ti troverai gli elementi nell'array in ordine crescente. Diciamo che l'operazione di stampa viene sostituita da quella di inserimento nell'array. Per il resto non cambia nulla.

    PS. Non mette la radice in posizione 0. In posizione 0 ci mette la foglia "più a sinistra" (se capisci cosa intendo).
  • Re: C Algoritmo sugli alberi

    Giusto giusto mi ero confuso io! alla fine era semplice!! grazie dell aiuto! (Y)
  • Re: C Algoritmo sugli alberi

    Prego!
  • Re: C Algoritmo sugli alberi

    PS. Se a qualcuno dovesse interessare, lascio qui una possibile realizzazione:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct t_albero
    {
        int val;
        struct t_albero *left;
        struct t_albero *right;
    } Nodo;
    
    typedef Nodo* Albero;
    
    Albero creaNodo(int val)
    {
        Albero nuovo = malloc(sizeof(Nodo));
        nuovo->val = val;
        nuovo->left = NULL;
        nuovo->right = NULL;
        return nuovo;
    }
    
    Albero inserisci(Albero a, int v)
    {
        Albero nuovo_nodo = creaNodo(v);
        if(a == NULL)
        {
            return nuovo_nodo;
        }
    
        Albero copia = a;
        if(v <= a->val)
        {
            a->left = inserisci(a->left, v);
        }
        else
        {
            a->right = inserisci(a->right, v);
        }
    
        return copia;
    }
    
    int conta_elementi(Albero alb)
    {
        if(alb == NULL)
            return 0;
        return(1 + conta_elementi(alb->left) + conta_elementi(alb->right));
    }
    
    void stampa_in_ordine(Albero alb)
    {
        if(alb == NULL)
            return;
    
        stampa_in_ordine(alb->left);
        printf("%d  ", alb->val);
        stampa_in_ordine(alb->right);
    }
    
    void albero_to_array(Albero alb, int* array, int* posiz_array)
    {
        if(alb == NULL)
            return;
        albero_to_array(alb->left, array, posiz_array);
        array[(*posiz_array)++] = alb->val;
        albero_to_array(alb->right, array, posiz_array);
    }
    
    void stampa_array(int* array, int dim)
    {
        int i;
        for(i=0; i<dim; i++)
        {
            printf("%d  ", array[i]);
        }
    }
    
    int main()
    {
        Albero alb = NULL;
    
        alb = inserisci(alb, 5);
        alb = inserisci(alb, 1);
        alb = inserisci(alb, 2);
        alb = inserisci(alb, 7);
        alb = inserisci(alb, 3);
        alb = inserisci(alb, 8);
    
        printf("Albero:  ");
        stampa_in_ordine(alb);
    
        int n_elem = conta_elementi(alb);
        int array[n_elem];
        int posiz_array = 0;
    
        printf("\n");
    
        albero_to_array(alb, array, &posiz_array);
        printf("Array:  ");
        stampa_array(array, n_elem);
    
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
9 risposte