STRUTTURE DATI e LABORATORIO II
ESERCITAZIONE N°14
albero di ricerca binario
Andrea Zanda
tutoraggio strutture dati 3-5-2004
1
TESTO ESERCITAZIONE
Scrivere un algoritmo C che implementi la struttura albero di
ricerca binario. Il programma deve prevedere le funzioni di
inserimento, cancellazione, visualizzazione e ricerca. Il
campo chiave è costituito da una stringa.
Suggerimento. Per semplicità si supponga che ogni dato sia
una stringa che ne costituisce la chiave. Per visualizzare i
dati utilizzare gli algoritmi che visitano l’albero.
Implementare inoltre sia l’algoritmo di ricerca ricorsivo che
quello iterativo.
Andrea Zanda
tutoraggio strutture dati 3-5-2004
2
ALBERI DI RICERCA BINARI
Un albero di ricerca binario offre delle prestazioni migliori
di quelle delle strutture dati finora studiare, quando le
operazioni da svolgere sono l’inserimento, la cancellazione
e la ricerca di elementi arbitrari.
Definizione:
Un albero di ricerca binario è un albero binario che soddisfa le
seguenti proprietà:
1) Ogni elemento ha una chiave e le chiavi sono uniche.
2) Le chiavi in un sottoalbero sinistro non vuoto devono essere più
piccole della chiave nella radice del sottoalbero.
3) Le chiavi in un sottoalbero destro non vuoto devono essere più
grandi della chiave nella radice del sottoalbero.
4) Anche i sottoalberi sinistro e destro sono alberi di ricerca binari
Andrea Zanda
tutoraggio strutture dati 3-5-2004
3
ALBERI DI RICERCA BINARI
ESEMPIO DI ALBERO DI RICERCA BINARIO:
30
40
5
2
Andrea Zanda
tutoraggio strutture dati 3-5-2004
4
INSERIMENTO
Per inserire un nuovo elemento dobbiamo prima verificare che
il valore di chiave sia diverso da quelli degli elementi esistenti.
Per fare questo utilizziamo una funzione di ricerca:
Se l’albero è vuoto o se il valore della chiave è presente
viene fornito NULL, in caso contrario la funzione fornisce
un puntatore all’ultimo dell’albero che è stato incontrato
durante la ricerca. Il nuovo elemento deve essere
inserito come figlio di questo nodo.
Andrea Zanda
tutoraggio strutture dati 3-5-2004
5
INSERIMENTO
ESEMPIO DI INSERIMENTO:
80
30
40
5
2
Andrea Zanda
80
tutoraggio strutture dati 3-5-2004
6
INSERIMENTO
ESEMPIO DI INSERIMENTO:
35
30
40
5
2
Andrea Zanda
35
tutoraggio strutture dati 3-5-2004
80
7
INSERIMENTO
Algoritmo
Andrea Zanda
tutoraggio strutture dati 3-5-2004
8
CANCELLAZIONE
CANCELLAZIONE DI UN NODO TERMINALE:
35
30
40
5
2
Andrea Zanda
35
tutoraggio strutture dati 3-5-2004
80
9
CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON
TERMINALE CON UN SOLO FIGLIO:
40
30
40
5
2
Andrea Zanda
80
tutoraggio strutture dati 3-5-2004
10
CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON
TERMINALE CON UN SOLO FIGLIO:
40
30
80
5
2
Andrea Zanda
tutoraggio strutture dati 3-5-2004
11
CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON
TERMINALE CON DUE FIGLI:
60
40
60
20
10
50
45
70
55
52
Andrea Zanda
tutoraggio strutture dati 3-5-2004
12
CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON
TERMINALE CON DUE FIGLI:
60
40
20
55
10
50
45
Andrea Zanda
tutoraggio strutture dati 3-5-2004
70
52
13
CANCELLAZIONE
Algoritmo
Andrea Zanda
tutoraggio strutture dati 3-5-2004
14
CANCELLAZIONE
CANCELLAZIONE DI UN NODO TERMINALE:
10
if ( p!=NULL && strcmp(item, p->dati)==0) {
if (node->destro==NULL) node = node->sinistro;
else if (node->sinistro==NULL) node=node->destro;
else {
tmp = node->sinistro;
previous = node;
while (tmp->destro!=NULL)
{
previous = tmp;
40
tmp = tmp->destro;
}
strcpy(node->dati, tmp->dati);
if (previous==node)
previous->sinistro = tmp->sinistro;
prev
else previous->destro = tmp->sinistro;
}
if (p==*root) *root = node;
p
else if (prev->sinistro == p)
prev->sinistro = node;
else prev->destro = node;
 node
}
20
10
node = NULL
Andrea Zanda
tutoraggio strutture dati 3-5-2004
15
CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON
TERMINALE CON UN SOLO FIGLIO:
prev

20 
10
 node
20
if ( p!=NULL && strcmp(item, p->dati)==0) {
if (node->destro==NULL) node = node->sinistro;
else if (node->sinistro==NULL) node=node->destro;
else {
tmp = node->sinistro;
previous = node;
while (tmp->destro!=NULL)
{
previous = tmp;
40
tmp = tmp->destro;
}
strcpy(node->dati, tmp->dati);
if (previous==node)
previous->sinistro = tmp->sinistro
p
else previous->destro = tmp->sinistro;
node
}
if (p==*root) *root = node;
else if (prev->sinistro == p)
prev->sinistro = node;
else prev->destro = node;
}
Andrea Zanda
tutoraggio strutture dati 3-5-2004
16
CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON
TERMINALE CON DUE FIGLI:
20
if ( p!=NULL && strcmp(item, p->dati)==0) {
if (node->destro==NULL) node = node->sinistro;
else if (node->sinistro==NULL) node=node->destro;
else {
tmp = node->sinistro;
previous = node;
while (tmp->destro!=NULL)
{
prev 40
previous = tmp;
tmp = tmp->destro;
}
strcpy(node->dati, tmp->dati);
if (previous==node)
p
previous
previous->sinistro = tmp->sinistro;
 node
else previous->destro = tmp->sinistro;
}
if (p==*root) *root = node;
 tmp
else if (prev->sinistro == p)
prev->sinistro = node;
else prev->destro = node;
}
20
10
Andrea Zanda
25
tutoraggio strutture dati 3-5-2004
17
RICERCA
La funzione di ricerca fornisce un puntatore al nodo
che contiene la chiave che stiamo cercando, oppure se
tale nodo non esiste fornisce NULL.
Algoritmo
ricorsivo
Andrea Zanda
Algoritmo
iterattivo
tutoraggio strutture dati 3-5-2004
18
VISUALIZZAZIONE
La visualizzazione può essere implementata con vari algoritmi:
preorder, inorder, postorder, level_order. La visualizzazione inorder ci
visualizzerà gli elementi con le chiavi ordinate.
eseguibile
Andrea Zanda
tutoraggio strutture dati 3-5-2004
19
SITO SLIDES
web.tiscali.it/ANDREAZ
Andrea Zanda
tutoraggio strutture dati 3-5-2004
20