Alberi

di il
6 risposte

Alberi

Ragazzi scusate io ho questo problema:devo controllare a profondità p che valori ci sono però la chiamata ricorsiva sul sotto albero sinistro mi riporta subito la foglia,mi sapete spiegare perché?
h e h2 rappresentano la profondità
void cercasin(struct tree *albero,int h){
int h2=h;
    struct tree *destro=NULL;
    destro=albero;
    while(h!=0){
    if(albero->left==NULL)
        break;
    else{
        h--;
        albero=albero->left;
    }
    }
 if(h==0)
    printf("%d",albero->x);
 while(h2!=0){
    if(destro->right==NULL)
        break;
    else{
        h2--;
        destro=destro->right;
    }
 }
    if(h2==0)
        printf("%d",destro->x);
    return 0;
}

6 Risposte

  • Re: Alberi

    La tua funzione e' ricorsiva o iterativa ?
    E' abbastanza ovvio che si comporti in modo strano. Dove sta' la ricorsione?

    Una funzione e' ricorsiva quando chiama se stessa (e bisogna ricordarsi di controllare la base della ricorsione).

    Qui' dove sta' la ricorsione?
    Dove ripristini i valori per ritornare al passo precedente della ricorsione?
  • Re: Alberi

    Ciao scusami è che avevo provato una versione iterativa siccome la ricorsiva non andava,ma comunque mi danno lo stesso problema ecco la versione ricorsiva
    destro è un albero uguale ad albero l'ho usato per fare le chiamate sul lato destro
    void cercasin(struct tree *albero,struct tree *destro,int h,int h2){
     if(h==0)
        printf("%d",albero->x);
        if(h2==0)
            printf("%d",destro->x);
            if(albero->left!=NULL)
            cercasin(albero->left,destro,--h,h2);
            if(destro->right!=NULL)
            cercasin(albero,destro->right,h,--h2);
    }
  • Re: Alberi

    Sono riuscito a farlo,ma non ho capito bene come funziona qualcuno potrebbe spiegarmelo? grazie
    void cercanodi(struct tree *albero,int h){
     if(albero==NULL)
        return 0;
     if(h==0)
        printf("%d",albero->x);
     else{
        cercanodi(albero->left,h-1);
        cercanodi(albero->right,h-1);
     }
    }
  • Re: Alberi

    A parole è un po' difficile, comunque:

    - Se stai cercando a una profondità maggiore di quella dell'albero ritorni 0 (nota che per albero intendo anche ogni sotto-albero di ogni passo ricorsivo). Immagino che ritorni 0 in modo da poter dare un messaggio d'errore nel caso l'altezza dell'albero iniziale sia minore della profondità a cui vuoi arrivare.

    - Se arrivi alla profondità desiderata stampi il valore ivi contenuto;

    - Altrimenti riesegui la funzione sia sul sotto-albero sinistro che sul destro, cercando però ad una profondità minore.

    Vedo però un errore: ritorni 0 in una funzione che dovrebbe tornare void; possibile che il compilatore non te lo dica?

    ciao
  • Re: Alberi

    Grazie tante per la risposta.Per quanto riguarda il return 0,come faccio a far finire la funzione?poi ho controllato con il debugger ed è proprio quel return 0,che fa funzionare la funzione.
  • Re: Alberi

    Metti solo return; senza 0 oppure usi opportunamente un if - else.

    ciao
Devi accedere o registrarti per scrivere nel forum
6 risposte