LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

di il
9 risposte

LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

Ciao a tutti...devo scrivere un programma che esegua una visita simmetrica su un albero binario di ricerca....ho provato così:
void visitaSimmetrica(nodo *tree){

  if(tree!=NULL){

    visitaSimmetrica(tree->left);

    printf("%d\n", tree->key);

    visitaSimmetrica(tree->right);

  }

}

il problema è che se la chiamo su un albero mi restituisce in input solo 3 valori.

esempio: se la chiamo su questo albero

5
/ \
2 9
/ /
1 6
\
7

mi stampa in output
1
5
7

Non capisco che cosa ci sia che non va...

Grazie per l'aiuto!

9 Risposte

  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Ciao,
    il codice mi sembra corretto. Sicuro che l'albero sia costruito correttamente? Intendo i vari link left e right associati agli elementi corretti.
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Ciao, il codice per costruire l'albero mi sembra corretto...te lo posto comunque per vedere se magari mi è sfuggito qualcosa!
    typedef struct _nodo{
    
      int key;
    
      struct _nodo *left;
    
      struct _nodo *right;
    
    } nodo;
    
    
    nodo* inserisciRic(nodo *tree, int input){
    
      if(tree==NULL){
    
        nodo *new=(nodo*) malloc(sizeof(nodo));
    
        new->key=input;
    
        new->left=NULL;
    
        new->right=NULL;
    
      }
    
      else{
    
        if(tree->key>input) tree->left=inserisciRic(tree->left, input);
    
        else tree->right=inserisciRic(tree->right, input);
    
      }
    
    }
    
    
    main(){
    
      int n, i, input; nodo *tree, *radice;
    
      scanf("%d", &n);
    
      if(n==0) radice=NULL;
    
      else{
    
        radice=(nodo*) malloc(sizeof(nodo));
    
        scanf("%d", &radice->key);
    
        radice->left=NULL;
    
        radice->right=NULL;
    
        tree=radice;
    
        for(i=1; i<n; i++){
    
          scanf("%d", &input);
    
          inserisciRic(tree, input);
    
        }
    
      }
    
      visitaSimmetrica(tree);
    
      return 0;
    
    }
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Ok, ci sono due errori:
    1. nella funzione inserisciRic devi restituire un puntatore alla radice dell'albero, mentre tu non restituisci niente
    2. quando inserisci un nuovo valore nell'albero non devi mettere
    
    inserisciRic(tree, input);
    
    ma
    
    tree = inserisciRic(tree, input);
    
    Corrette queste cose dovrebbe funzionare.
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Ok capito...ma il punto due si riferisce alla funzione main giusto??
    Cioe nel for devo mettere anche tree=inserisciRic(tree, input) invece che solamente inserisciRic(tree, input)??
    Invece nella funzione inserisciRic devo solamente mettere alla fine della procedura un return tree no??

    comunque grazie dell aiuto...appena arrivo a casa provo e poi faccio sapere!
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Sì il punto due si riferisce al main e nella funzione inserisciRic devi introdurre un qualche return che ti restituisca il puntatore alla radice.
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Ho provato a fare le modifiche che mi hai detto ma adesso mi stampa in output solo la radice...non capisco come mai!
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Io pensavo a una funzione del genere:
    
    nodo* inserisciRic(nodo *tree, int input)
    {
        if(tree==NULL)
        {
            nodo *new=(nodo*) malloc(sizeof(nodo));
            new->key=input;
            new->left=NULL;
            new->right=NULL;
            return new;
        }
        else
        {
            if(tree->key>input) tree->left=inserisciRic(tree->left, input);
            else tree->right=inserisciRic(tree->right, input);
            return tree;
        }
    }
    E quando la richiami fai
    tree = inserisciRic(tree, input);
    A me funziona...
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Hai ragione scusa...ora torna anche a me...avevo dimenticato di inserire il return new;

    grazie mille per l'aiuto!
  • Re: LINGUAGGIO C, visita simmetrica su alberi binari di ricerca

    Prego!
Devi accedere o registrarti per scrivere nel forum
9 risposte