HTML.it è il sito italiano del web publishing

[C] Cercare elemento in albero binario



scegli un altro forum
    Indietro   Ricarica   Avanti Invia una risposta

Autore
Discussione     
goatboy
Utente di HTML.it



Registrato il: Mar 2011

Provenienza: Salerno

Messaggi: 316


ICQ:

MSN:

Skype: goatboy0


[C] Cercare elemento in albero binario
Salve a tutti, ho un problema con la ricerca di un intero all'interno di un albero binario.
Questa è la funzione di ricerca, presa dal libro di testo da cui sto studiando, e mi è chiara.

codice:
TNode *binarytree_search(TBinaryTree bt, TInfo info){
    /* Caso base: Albero vuoto oppure la root è l'elemento cercato */
    if((bt==NULL) || bt->info==info){
        return bt;
    }else{
        if(info>bt->info){
            /* Fase di divide et impera */
            return binarytree_search(bt->right, info);
        }else{
            /* Fase di divide et impera */
            return binarytree_search(bt->left, info);
        }
    }
}


Restituisce il riferimento all'elemento, se è presente, altrimenti restituisce null.
Ma ho un dubbio, non riesco a capire cosa voglia dire "restituisce il riferimento"..
Come posso stampare il numero di occorrenze del numero cercato? La funzione è di tipo TNode e non capisco perchè, di solito le funzioni di ricerca sono di tipo int.

Ho provato così ma ho sicuramente combinato un macello, anche se non mi da errori..

codice:
printf("Inserisci l'elemento che vuoi cercare: ");
scanf("%d", &num);
src=binarytree_search(bt, num);
printf("L'elemento e' presente %d volte\n\n", src);


Qualche consiglio? Ho lo stesso problema anche con le funzioni di ricerca del massimo e del minimo in un albero.

Ultima modifica ad opera dell'utente goatboy il 20-05-2012 alle 15:03

Segnala ad un moderatore | IP: Collegato | Permalink

goatboy è offline Old Post 20-05-2012 14:55
Clicca qui per vedere il profilo dell'utente goatboy Clicca qui per inviare all'utente goatboy un messaggio privato Visualizza ulteriori messaggi scritti dall'utente goatboy Aggiungi l'utente goatboy alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Scara95
Utente di HTML.it



Registrato il: Jul 2009

Provenienza: Verona (provincia)

Messaggi: 1176


ICQ :

MSN :

Skype :


E' un
codice:
TNode *

non un
codice:
TNode


Controlla la dichiarazione di TNode...


__________________
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Segnala ad un moderatore | IP: Collegato | Permalink

Scara95 è offline Old Post 20-05-2012 15:09
Clicca qui per vedere il profilo dell'utente Scara95 Clicca qui per inviare all'utente Scara95 un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Scara95 Aggiungi l'utente Scara95 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Kaamos
Utente di HTML.it



Registrato il: Dec 2009

Provenienza: Genova

Messaggi: 606


ICQ :

MSN :

Skype :


Re: [C] Cercare elemento in albero binario
Citazione:
Originariamente inviato da goatboy
Salve a tutti, ho un problema con la ricerca di un intero all'interno di un albero binario.
Questa è la funzione di ricerca, presa dal libro di testo da cui sto studiando, e mi è chiara.

codice:
TNode *binarytree_search(TBinaryTree bt, TInfo info){
    /* Caso base: Albero vuoto oppure la root è l'elemento cercato */
    if((bt==NULL) || bt->info==info){
        return bt;
    }else{
        if(info>bt->info){
            /* Fase di divide et impera */
            return binarytree_search(bt->right, info);
        }else{
            /* Fase di divide et impera */
            return binarytree_search(bt->left, info);
        }
    }
}


Restituisce il riferimento all'elemento, se è presente, altrimenti restituisce null.
Ma ho un dubbio, non riesco a capire cosa voglia dire "restituisce il riferimento"..
Come posso stampare il numero di occorrenze del numero cercato? La funzione è di tipo TNode e non capisco perchè, di solito le funzioni di ricerca sono di tipo int.

Ho provato così ma ho sicuramente combinato un macello, anche se non mi da errori..

codice:
printf("Inserisci l'elemento che vuoi cercare: ");
scanf("%d", &num);
src=binarytree_search(bt, num);
printf("L'elemento e' presente %d volte\n\n", src);


Qualche consiglio? Ho lo stesso problema anche con le funzioni di ricerca del massimo e del minimo in un albero.


Cosa vuol dire "di solito sono di tipo int"? Quella non è una funziona che conta le occorrenze di un elemento, ma una funzione che restituisce il puntatore ad un nodo contenente l'elemento cercato, se esiste. Tu cosa vuoi fare, cercare un nodo (ed eventualmente ottenerne il riferimento) o contare le occorrenze di un elemento?

Comunque per riferimento di qualcosa s'intende il suo indirizzo, ciò che viene messo all'interno di un puntatore.

Segnala ad un moderatore | IP: Collegato | Permalink

Kaamos è offline Old Post 20-05-2012 15:27
Clicca qui per vedere il profilo dell'utente Kaamos Clicca qui per inviare all'utente Kaamos un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Kaamos Aggiungi l'utente Kaamos alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
goatboy
Utente di HTML.it



Registrato il: Mar 2011

Provenienza: Salerno

Messaggi: 316


ICQ :

MSN :

Skype : goatboy0


Si, non so perchè mi ero intestardito che la funzione mi restituisse il numero di occorrenze. Per fortuna avevo scritto "la funzione mi è chiara"
Ripensandoci ho capito, e ho risolto così:

codice:
                printf("Inserisci l'elemento che vuoi cercare: ");
                scanf("%d", &num);
                src=binarytree_search(bt, num);
                if(src==NULL)
                    printf("Elemento non presente\n");
                else
                    printf("L'elemento e' presente all'interno dell'albero\n");


dove src è:

codice:
TNode *src;


Se volessi invece inserire un contatore nella funzione, come potrei fare?

Segnala ad un moderatore | IP: Collegato | Permalink

goatboy è offline Old Post 20-05-2012 15:31
Clicca qui per vedere il profilo dell'utente goatboy Clicca qui per inviare all'utente goatboy un messaggio privato Visualizza ulteriori messaggi scritti dall'utente goatboy Aggiungi l'utente goatboy alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Who am I
Utente bannato



Registrato il: Apr 2012

Provenienza:

Messaggi: 518


ICQ :

MSN :

Skype :


Da come è scritto il codice deduco che si tratta di un albero binario di ricerca, infatti da questo spezzone di codice:

codice:
        if(info > bt->info)
        {
            return binarytree_search(bt->right, info);
        }
        else
        {
            return binarytree_search(bt->left, info);
        }
    }
}


Si capisce che se l' informazione contenuta nel nodo è minore di quella cercata, si cerca nel sotto-albero destro, altrimenti si cerca nel sotto-albero sinistro.
Per cui non è possibile contare il numero di occorrenze di un valore, il numero di occorrenze sarà 1 oppure 0 visto che l' albero binario di ricerca (se implementato correttamente) non contiene duplicati.

Segnala ad un moderatore | IP: Collegato | Permalink

Who am I è offline Old Post 20-05-2012 21:24
Clicca qui per vedere il profilo dell'utente Who am I Clicca qui per inviare all'utente Who am I un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Who am I Aggiungi l'utente Who am I alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Kaamos
Utente di HTML.it



Registrato il: Dec 2009

Provenienza: Genova

Messaggi: 606


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da Who am I
Da come è scritto il codice deduco che si tratta di un albero binario di ricerca, infatti da questo spezzone di codice:

codice:
        if(info > bt->info)
        {
            return binarytree_search(bt->right, info);
        }
        else
        {
            return binarytree_search(bt->left, info);
        }
    }
}


Si capisce che se l' informazione contenuta nel nodo è minore di quella cercata, si cerca nel sotto-albero destro, altrimenti si cerca nel sotto-albero sinistro.
Per cui non è possibile contare il numero di occorrenze di un valore, il numero di occorrenze sarà 1 oppure 0 visto che l' albero binario di ricerca (se implementato correttamente) non contiene duplicati.


Non sono sicuro di questa condizione di unicità degli elementi, si trovano svariate definizioni di albero binario di ricerca e molte di esse contengono condizioni per i sotto-alberi destri e sinistri tipo "maggiore o uguali di" o "minore o uguale di", il che ovviamente implica che la struttura ammette duplicati.

Però se si seguisse rigorosamente la definizione matematica penso avresti ragione tu, visto che se non sbaglio gli alberi sono grafi e nei grafi gli elementi stanno in un insieme, e gli insieme non possono avere duplicati.

Segnala ad un moderatore | IP: Collegato | Permalink

Kaamos è offline Old Post 20-05-2012 21:54
Clicca qui per vedere il profilo dell'utente Kaamos Clicca qui per inviare all'utente Kaamos un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Kaamos Aggiungi l'utente Kaamos alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Who am I
Utente bannato



Registrato il: Apr 2012

Provenienza:

Messaggi: 518


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da Kaamos
Non sono sicuro di questa condizione di unicità degli elementi, si trovano svariate definizioni di albero binario di ricerca e molte di esse contengono condizioni per i sotto-alberi destri e sinistri tipo "maggiore o uguali di" o "minore o uguale di", il che ovviamente implica che la struttura ammette duplicati.

Però se si seguisse rigorosamente la definizione matematica penso avresti ragione tu, visto che se non sbaglio gli alberi sono grafi e nei grafi gli elementi stanno in un insieme, e gli insieme non possono avere duplicati.


La definizione dice che ogni dato contenuto in un nodo è una chiave, per cui ha un valore univoco e non ci sono ambiguità nella definizione.

Segnala ad un moderatore | IP: Collegato | Permalink

Who am I è offline Old Post 20-05-2012 23:03
Clicca qui per vedere il profilo dell'utente Who am I Clicca qui per inviare all'utente Who am I un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Who am I Aggiungi l'utente Who am I alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Kaamos
Utente di HTML.it



Registrato il: Dec 2009

Provenienza: Genova

Messaggi: 606


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da Who am I
La definizione dice che ogni dato contenuto in un nodo è una chiave, per cui ha un valore univoco e non ci sono ambiguità nella definizione.


Non ho capito, dalla pagina che hai linkato:

"The right subtree of a node contains only nodes with keys greater than or equal to the node's key."

Segnala ad un moderatore | IP: Collegato | Permalink

Kaamos è offline Old Post 20-05-2012 23:11
Clicca qui per vedere il profilo dell'utente Kaamos Clicca qui per inviare all'utente Kaamos un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Kaamos Aggiungi l'utente Kaamos alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Scara95
Utente di HTML.it



Registrato il: Jul 2009

Provenienza: Verona (provincia)

Messaggi: 1176


ICQ :

MSN :

Skype :


Potrebbe non essere usato come albero di ricerca ma come struttura ordinata che ammette duplicati...


__________________
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Segnala ad un moderatore | IP: Collegato | Permalink

Scara95 è offline Old Post 21-05-2012 06:04
Clicca qui per vedere il profilo dell'utente Scara95 Clicca qui per inviare all'utente Scara95 un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Scara95 Aggiungi l'utente Scara95 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
goatboy
Utente di HTML.it



Registrato il: Mar 2011

Provenienza: Salerno

Messaggi: 316


ICQ :

MSN :

Skype : goatboy0


Più che altro a me interessava sapere se poteva capitare all'esame scritto che mi si chiedesse di "contare" le occorrenze di un dato elemento, e nel caso come si potrebbe fare. Ma se non è possibile, allora so che non capiterà
Grazie per le risposte

Segnala ad un moderatore | IP: Collegato | Permalink

goatboy è offline Old Post 21-05-2012 12:08
Clicca qui per vedere il profilo dell'utente goatboy Clicca qui per inviare all'utente goatboy un messaggio privato Visualizza ulteriori messaggi scritti dall'utente goatboy Aggiungi l'utente goatboy alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Scara95
Utente di HTML.it



Registrato il: Jul 2009

Provenienza: Verona (provincia)

Messaggi: 1176


ICQ :

MSN :

Skype :


È possibile se si tratta solo di una struttura dati ordinata, in ogni caso l'elemento uguale è subito adiacente all'elemento stesso o a sinistra o a destra (la posizione dipende dall'inserimento).
Per completezza: potrebbero esserci duplicati anche nel caso in cui l'albero venga utilizzato per implementare un algoritmo di ordinamento...


__________________
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Segnala ad un moderatore | IP: Collegato | Permalink

Scara95 è offline Old Post 21-05-2012 15:01
Clicca qui per vedere il profilo dell'utente Scara95 Clicca qui per inviare all'utente Scara95 un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Scara95 Aggiungi l'utente Scara95 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Tutte le ore sono con fuso orario CET. Ora sono le 06:43.     

    Ultima discussione   Prossima discussione Invia una risposta
Versione per la stampa | Invia il thread via email | Ricevi aggiornamenti sul thread | Scarica il thread
 

Cerchi un argomento specifico e hai fretta? Usa il motore di ricerca