Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    [C] inserimento albero binario

    Ciao a tutti, è da poco che ho iniziato a prendere connfidenza con gli alberi e stavo cercando di capire come fare l'insersione di una sequenza numerica in input da tastiera in un albero binario...da quanto ho letto, ho capito che bisogna inserire il numero appena netto e fare dei confronti partendo dalla radice, se minore spostarsi nel sottoalbero di sinistra, altrimenti a destra, poi effettuare lo stesso confronto e muoversi sempre allo seguendo questo schema...
    quindi se introduco come sequenza d numeri:
    13 5 34 7 45 9 1 si avrà un albero tipo quello dell'immagine allegata...QUI
    Corretto??
    inoltre volevo sapere se questo era l'unico modi di insersione in un albero binario o se magari questo è il più comune poichè anche più comodo e facilmente gestibile e abbastanza semplice da implementare...
    grazie
    Mrx87

  2. #2
    un "albero binario" è una particolare "struttura ad albero" che per sua definizione è strutturato come hai detto
    ciao
    sergio

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ahh...quindi io potrei anche creare una insersione per un albero (non binario) e i numeri li inserisco secondo un criterio che piace a me...si può?? nel senso non è obligatorio inserire una sequenza d numeri per forza in un albero binario...

  4. #4
    L'albero binario lo gestisci come vuoi, naturalmente deve restare binario (cioè ogni padre ha massimo due figli).

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    okay grazie mille per le risposte e per i chiarimenti...io ho provato ad implementare questo algoritmo di insersione...ma ci deve essere qualcosa che non va...perchè inserendo una sequenza di numeri che leggo da file, e stampando con l'algoritmo "inOrder" stampa solo l'ultimo numero che legge da file...non sono riuscito a capire il problema...se qualcono mi sa dare una dritta...grazie mille...

    input da file : 10 6 10 4 5 4
    output: 4

    posto qua il codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct arbero {
            int val;
            struct arbero *left;
            struct arbero *right;
    }tree;
    
    tree* NewE ( void );
    tree* insertion ( tree* ptr, int v );
    void print_in_order ( tree* ptr );
    
    int main ()
    {
        tree* root;
        int v;
        FILE  *aptr;
        
        root = NULL;
        
        aptr = fopen("valori.txt","r");
        
        while ( fscanf(aptr,"%d", &v) != EOF ) {
              root = insertion ( root, v );
        }
        fclose(aptr);
        
        print_in_order ( root );
        
        printf ("\n");
        system("pause");
        return(1);
    }
    tree* insertion ( tree* ptr, int v ) 
    {
          if ( ptr ==  NULL ) {
               
               ptr = NewE ( );
               ptr->val = v;
               ptr->left = NULL;
               ptr->right = NULL;
               
          }
          else {
               if ( v < ptr->val ) {
                    ptr = insertion ( ptr->left, v );
               }
               else if ( v > ptr->val ) {
                    ptr = insertion ( ptr->right, v );
               }
               else {
                    printf ("Dato duplicato\n");
               }
          }
          return ( ptr );
    }    
    void print_in_order ( tree* ptr )
    {
         if ( ptr != NULL ) {
              print_in_order ( ptr->left );
              printf ("%3d", ptr->val);
              print_in_order ( ptr->right );
         }
    }      
    tree* NewE ( void ) 
    {
          tree* p;
          
          p = (tree*)malloc(sizeof(tree));
          
          if ( p == NULL ) {
               printf ("Errore allocazione!\n");
               system("pause");
               exit(1);
          }
          return (p);
    }

  6. #6
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Ciao,
    codice:
              root = insertion ( root, v );
    con il codice scritto così è normale che tu modifichi sempre la root del tuo albero, e che quindi il tuo albero sarà sempre composto da un solo elemento, in qusto caso l'ultimo che inserisci.

    Te invece devi modificarla solamente se l'albero è vuoto, negli altri casi la root rimane quella che è, io penso che ci siano delle modifiche da fare:

    1) una è controllare questa eventualità ed agire di conseguenza..

    2) Un'altra invece è nella funzione di inserimento nell'albero, in cui per lo stesso motivo, se inserisci a destra è il ramo destro a dover essere modificato (ptr->right) e non (ptr), stessa cosa per il sinistro.


    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  7. #7
    sì, l'errore è dove ha detto LesLex, modifca così il main e dovrebbe andare a posto
    codice:
    ...
        while ( fscanf(aptr,"%d", &v) != EOF ) {
           if ( !root )   
             root = insertion ( root, v );
           else
             insertion ( root, v );
        }
    ---

  8. #8
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ma quindi la funzione insertion() che sta nell'else devo riscriverla e dichiararla void....

  9. #9
    Utente di HTML.it L'avatar di LexLex
    Registrato dal
    May 2008
    Messaggi
    56
    Originariamente inviato da MrX87
    ma quindi la funzione insertion() che sta nell'else devo riscriverla e dichiararla void....
    Riscriverla proprio no !! e devi lasciare che ritorni il puntatore altrimenti non funzionerebbe la ricorsione, però devi modificare il puntatore che stà prima dell'uguale da ptr a ptr->right, (in fondo stai modificando quello no?) e la stessa cosa per il ramo sinistro.

    Ciao
    "Dai Diamanti non nasce niente, dal letame nascono i fiori.. " F.De Andrè

  10. #10
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    grande per le correzioni....funziona perfettamente...

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.