Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2006-7
è frequente la costruzione esplicita di alberi binari in algoritmi ricorsivi divide et impera
riconsideriamo ad es. il problema della ricerca del massimo fra gli elementi di un array di interi, proposto nella lezione 19: vediamone ora una soluzione basata sulla costruzione di un torneo:
l'algoritmo è simile a quello già visto nella lezione 19, eccetto che la soluzione è qui prodotta dalla funzione ricorsiva di costruzione del torneo su (una parte de)gli elementi dell'array, che restituisce un puntatore alla radice del torneo costruito
struct btree { Elem elem; btree *l, *r; btree(Elem x) { elem = x; l = 0; r = 0; } }; typedef btree* btlink; btlink max(Elem a[], int l, int r) { int m = (l+r)/2; btlink x = new btree(a[m]); if (l == r) return x; x->l = max(a, l, m); x->r = max(a, m+1, r); Elem u = x->l->elem, v = x->r->elem; if (u > v) x->elem = u; else x->elem = v; return x; }
un torneo è un caso particolare di una struttura dati molto utile per la realizzazione di efficienti algoritmi di ricerca su insiemi ordinati:
è facile intuire come, ad es., l'algoritmo di ricerca binaria di un elemento in un array ordinato possa tradursi in un algoritmo di ricerca in un BST
concludiamo con dei cenni sulla generalizzazione degli algoritmi (ricorsivi e non) visti per l'attraversamento di alberi binari all'attraversamento di grafi, ad es. rappresentati da liste di adiacenza
si possono distinguere due discipline di attraversamento:
analogamente al caso degli alberi, per i grafi: