Laboratorio di Informatica
Lezione 8:
Gli algoritmi per gli alberi
In questa lezione vedremo:
ÎUn cenno agli alberi binari
ÎGli algoritmi fondamentali per gli alberi
ÎUn programma esemplificativo
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
2
La struttura di un albero generico
Info
P
P
P
P
P
P
Info
Info
P
P
P
P
Info
Info
P
P
P
Lezione 8: Gli algoritmi per gli alberi
P
P
P
P
P
P
P
P
P
P
P
P
Non esistono
percorsi chiusi
2/14/03 09:15
3
La struttura di un albero binario
Info
P
Sottoalbero
Info
P
Ø
Lezione 8: Gli algoritmi per gli alberi
P
Info
Info
P
Nodo radice
Ø
P
Info
Ø
P
Nodo figlio
del nodo
radice
Info
Ø
Ø
Foglia
2/14/03 09:15
4
Alberi binari
ÎEsiste un solo genitore per ogni nodo tranne che per il
nodo radice;
ÎDue puntatori diversi si riferiscono a due nodi diversi: se
così non fosse, si tratterebbe di un grafo;
ÎNegli alberi binari possono esistere per ogni nodo 0, 1 o
2 figli;
ÎSi definisce altezza di un albero il livello del nodo più
profondo;
ÎLa struttura dell’albero è intrinsecamente ricorsiva: ogni
sottoalbero è a sua volta un albero.
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
5
Inserzione 1
Tigre
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
6
Inserzione 1
Tigre
Cane
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
7
Inserzione 1
Tigre
Cane
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
8
Inserzione 2
Tigre
Cane
Rana
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
9
Inserzione 2
Tigre
Cane
Rana
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
10
Inserzione 3
Tigre
Cane
Bue
Lezione 8: Gli algoritmi per gli alberi
Rana
2/14/03 09:15
11
Inserzione 3
Tigre
Cane
Bue
Lezione 8: Gli algoritmi per gli alberi
Rana
2/14/03 09:15
12
Inserzione 4
Tigre
Cane
Bue
Rana
Leone
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
13
Inserzione 4
Tigre
Cane
Bue
Rana
Leone
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
14
In altre parole:
ÎSe l’albero è vuoto:
l
inseriamo il nuovo elemento;
Îaltrimenti:
l
se la chiave è inferiore al nodo:
• applicare l’algoritmo nel sottoalbero sinistro;
l
se la chiave è superiore al nodo:
• applicare l’algoritmo nel sottoalbero destro;
l
altrimenti:
• L’elemento esiste già.
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
15
Attenzione alle inserzioni!
Gatto
Gatto
Cane
Elefante
Cane
Tigre
Civetta
Tigre
Leone
Elefante
Leone
Topo
Topo
Giraffa
Lezione 8: Gli algoritmi per gli alberi
Civetta
Giraffa
2/14/03 09:15
16
Attenzione alle inserzioni!
Cane
Cane
Leone
Civetta
Elefante
Civetta
Gatto
Giraffa
Tigre
Elefante
Leone
Tigre
Topo
Topo
Gatto
Giraffa
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
17
La visita
Îse l’albero è vuoto:
l
non fare nulla;
Î!a! ltrimenti:
l
l
l
- estrarre il sottoalbero di sinistra;
- estrarre il nodo radice;
- estrarre il sottoalbero di destra.
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
18
La ricerca
Îse l’albero è vuoto:
l
chiave non trovata;
Îaltrimenti:
l
se la chiave è inferiore al nodo:
• applicare l’algoritmo nel sottoalbero sinistro;
l
se la chiave è superiore al nodo:
• applicare l’algoritmo nel sottoalbero destro;
l
altrimenti:
• chiave trovata: è nel nodo in esame.
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
19
Per esemplificare:
typedef struct node
//Questa è la definizione
//del nodo dell'albero
{
nonsocosa
Info; //Contenuto informativo
struct node *psnLeft, *psnRight; // puntatori
//ai prox. nodi
}
NODOALB, *PTRNODOALB;
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
20
Creiamo un nuovo nodo (1):
PTRNODOALB addnode (PTRNODOALB psn)
{
if (psn == NULL)
{
}
Lezione 8: Gli algoritmi per gli alberi
// L'albero e' vuoto o siamo
// arrivati in fondo a un ramo
psn = (PTRNODOALB) malloc(sizeof(NODOALB));
psn->Info = …;
psn->psnLeft = psn->psnRight = NULL;
2/14/03 09:15
21
Creiamo un nuovo nodo (2):
else
{
if (chiave < psn->Info)
psn->psnLeft = addnode(psn->psnLeft);
// Scendiamo verso sinistra
else if (chiave > psn->Info)
psn->psnRight = addnode(psn->psnRight);
// Scendiamo verso destra
else
fai qualcosa di sensato // Trovato!
}
return psn;
}
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
22
E adesso vediamo un esempio pratico:
ÎIl programma opera su un albero i cui nodi contengono:
l
l
Una parola, usata come chiave per l’ordinamento (Word)
Un numero intero (Count).
ÎIl programma legge da un file una serie di parole. Per
ogni parola:
l
l
l
Vengono applicate alcune regole di filtraggio (minuscole ->
maiuscole, etc.)
Se l’albero non la contiene ancora viene creato un nuovo nodo
Se l’albero la contiene già viene incrementato Count.
ÎIl programma stampa l’elenco (in ordine alfabetico) di
tutte le parole lette e il numero di occorrenze di ogni
parola.
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
23
Inoltre…
ÎE’ possibile immettere parole da tastiera, e sapere
quante occorrenze ci sono per ogni parola.
Lezione 8: Gli algoritmi per gli alberi
2/14/03 09:15
24