Indice

Esercitazione alberi

Esercizio 1

Definire il tipo albero_s_t di un albero binario in cui le etichette sono stringhe di al piu' 20 caratteri. Scrivere una funzione

int conta_occorrenze ( albero_s_t * root, char * s );

che conta le occorrenze della stringa s nell'albero di radice root e restituisce tale numero.

Esercizio 2

Definire il tipo albero_d_t di un albero binario in cui le etichette sono valori di tipo double. Scrivere una funzione

double somma_le_foglie ( albero_d_t * root);

che restituisce la somma dei valori delle etichette delle sole foglie dell'albero.

Esercizio 3

Utilizzando il tipo albero_d_t dell'esercizio precedente. Scrivere una funzione

albero_d_t * leggi_albero ( void );

che legge da standard input una sequenza di valori double terminata da EOF e restituisce il puntatore ad un nuovo albero ce contiene tutti i valori letti. L'albero deve essere costruito in modo da essere ordinato, cioe' dato un nodo n tutti i valori nel sottoalbero sinistro devono essere minori o uguali del valore in n, mentre i valori nel sottoalbero destro devono essere tutti maggiori o uguali di n.

Verificare che stampando i valori delle etichette con una visita simmetrica otteniamo una sequenza crescente.

Esercizio 4

Utilizzando il tipo albero_d_t dell'esercizio precedente, scrivere una funzione che trasforma l'albero in una lista di double inserendo le etichette nell'ordine della visita anticipata

lista_d_t * tree_to_list ( albero_d_t * root );

Esercizio 5: Alberi binari di ricerca

Un albero binario di ricerca e' un albero in cui in ogni nodo $n$ e' verificata la relazione $$ E(n_{sx}) \leq E(n) \leq E(n_{dx}) $$ dove $n_{sx}$ e' un qualsiasi nodo dell'albero di sinistra e $n_{dx}$ e' un qualsiasi nodo dell'albero di destra. Utilizzando il tipo albero_d_t realizzate le seguenti funzioni:

/* inserisce l'etichetta x nell'albero mantenedolo ordinato, 
restituisce il puntatore al nuovo albero */
albero_d_t* inserisci_ord ( albero_d_t * root, double x );
/* ricerca l'etichetta x nell'albero analizzando un numero di nodi pari all'altezza dell'albero 
 restituisce 1 se la trova e 0 se non la trova */
int inserisci_ord ( albero_d_t * root, double x );
/* cancella l'etichetta x nell'albero mantenedolo ordinato e deallocando l'etichetta (difficile!)
restituice il puntatore al nuovo albero */
albero_d_t* cancella_ord ( albero_d_t * root, double x );

Approfondimenti: Eulero e il problema dei ponti di Koeningsberg

Questo e' il link al problema di Eulero che ha dato origine alla teria dei grafi che abbiamo accennato nella lezione di oggi