Da albero ad array

di il
2 risposte

Da albero ad array

Salve ragazzi ho un albero,e con questo albero devo creare un array
void caricaarray(struct tree *albero,int *a,int i,int n){
if(albero!=NULL){
    if(i<n){
        a[i]=albero->x;
        i=i+1;
    }
    caricaarray(albero->left,a,i,n);
    caricaarray(albero->right,a,i,n);
}
}
il problema è che se metto una sequenza in questo modo: 1 2 3 (4) 5 6 7
parte dal sotto albero sinistro mi riempie l'array però poi quando arriva dinuovo a 4 la i me la riporta dinuovo a 0 e quindi mi riscrive sugli elementi gia messi

2 Risposte

  • Re: Da albero ad array

    Succede perché quando chiami la funzione sul ramo destro questa riceve lo stesso valore di i della funzione che ha operato sul sinistro. E' un po' difficile da spiegare, ma avviene una cosa del genere:

    - 1^ chiamata della funzione: i vale 0 e viene incrementato a 1;
    - 2^ chiamata (all'interno della prima): è la funzione che opera sul sinistro. i vale 1 e viene incrementato a 2;

    Supponiamo persemplicità che il ramo sinistro sia già finito:

    - si torna alla funzione 1, che però non può sapere di quanto è stato incrementato i nel ramo sinistro. Quindi i vale ancora 1;
    - 3^ chiamata (sempre all'interno della prima): è la funzione che opera sull'altro ramo. i vale 1 e viene incrementato a 2;

    eccetera.

    potresti risolvere facendo ritornare i, in questo modo:
    
    int caricaarray(struct tree *albero,int *a,int i,int n){
    if(albero!=NULL){
        if(i<n){
            a[i]=albero->x;
            i=i+1;
        }
        i=caricaarray(albero->left,a,i,n);
        i=caricaarray(albero->right,a,i,n);
    }
    return i;
    }
    
  • Re: Da albero ad array

    O in alternativa dichiararlo come puntatore:
    
    void caricaarray(struct tree *albero,int *a,int *i,int n)
    {
        if(albero != NULL)
        {
            if( *i < n )
            {
                a[ (*i)++ ] = albero->x;
            }
            caricaarray(albero->left,a,i,n);
            caricaarray(albero->right,a,i,n);
        }
    }
    
    dato che a poi è un vettore si può effetture una semplificazione,semplifico senza usare gestione errori:
    
    int* caricaarray(struct tree *albero,int *a)
    {
        if(albero != NULL)
        {
            (*a)++ = albero->x;
            a = caricaarray(albero->left,a);
            a = caricaarray(albero->right,a);
        }
        return a;
    }
    
    Dato che la funzione crea un nuovo puntarore l'effettvo avanzamento di esso dovrà essere restituito al chiamante altrimenti si verificherà lo stesso problema riscontrato all'inizio del thread.


    Ricordo che una corretta tabulazione aiuta nel decifrare meglio il codice usato.
Devi accedere o registrarti per scrivere nel forum
2 risposte