Title: Esame Parziale Strutture Dati Del 26-04-01
1STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N14
albero di ricerca binario
2TESTO 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 lalbero. Implementare
inoltre sia lalgoritmo di ricerca ricorsivo che
quello iterativo.
3ALBERI 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 linserimento, 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
4ALBERI DI RICERCA BINARI
ESEMPIO DI ALBERO DI RICERCA BINARIO
30
40
5
2
5INSERIMENTO
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 lalbero è vuoto o se il valore della chiave è
presente viene fornito NULL, in caso contrario la
funzione fornisce un puntatore allultimo
dellalbero che è stato incontrato durante la
ricerca. Il nuovo elemento deve essere inserito
come figlio di questo nodo.
6INSERIMENTO
ESEMPIO DI INSERIMENTO
80
30
40
5
2
80
7INSERIMENTO
ESEMPIO DI INSERIMENTO
35
30
40
5
2
35
80
8INSERIMENTO
Algoritmo
9CANCELLAZIONE
CANCELLAZIONE DI UN NODO TERMINALE
35
30
40
5
2
35
80
10CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON TERMINALE CON UN
SOLO FIGLIO
40
30
40
5
2
80
11CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON TERMINALE CON UN
SOLO FIGLIO
40
30
80
5
2
12CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE
FIGLI
60
40
60
20
10
50
70
45
55
52
13CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE
FIGLI
60
40
20
55
10
50
70
45
52
14CANCELLAZIONE
Algoritmo
15CANCELLAZIONE
10
CANCELLAZIONE DI UN NODO TERMINALE
if ( p!NULL strcmp(item, p-gtdati)0)
if (node-gtdestroNULL) node node-gtsinistro
else if (node-gtsinistroNULL) nodenode-gtdes
tro else tmp
node-gtsinistro previous node
while (tmp-gtdestro!NULL)
previous tmp
tmp tmp-gtdestro
strcpy(node-gtdati,
tmp-gtdati) if (previousnode) pr
evious-gtsinistro tmp-gtsinistro
else previous-gtdestro tmp-gtsinistro
if (proot) root node
else if (prev-gtsinistro p) prev-gtsinistro
node else prev-gtdestro node
40
prev?
20
? p
10
? node
node NULL
16CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON TERMINALE CON UN
SOLO FIGLIO
20
if ( p!NULL strcmp(item, p-gtdati)0)
if (node-gtdestroNULL) node node-gtsinistro
else if (node-gtsinistroNULL) nodenode-gtdes
tro else tmp
node-gtsinistro previous node
while (tmp-gtdestro!NULL)
previous tmp
tmp tmp-gtdestro
strcpy(node-gtdati,
tmp-gtdati) if (previousnode) pr
evious-gtsinistro tmp-gtsinistro
else previous-gtdestro tmp-gtsinistro
if (proot) root node
else if (prev-gtsinistro p) prev-gtsinistro
node else prev-gtdestro node
prev?
40
? p
20
? node
10
? node
17CANCELLAZIONE
CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE
FIGLI
20
if ( p!NULL strcmp(item, p-gtdati)0)
if (node-gtdestroNULL) node node-gtsinistro
else if (node-gtsinistroNULL) nodenode-gtdes
tro else tmp
node-gtsinistro previous node
while (tmp-gtdestro!NULL)
previous tmp
tmp tmp-gtdestro
strcpy(node-gtdati,
tmp-gtdati) if (previousnode)
previous-gtsinistro
tmp-gtsinistro else
previous-gtdestro tmp-gtsinistro
if (proot) root node else if
(prev-gtsinistro p) prev-gtsinistro node
else prev-gtdestro node
prev?
40
? p
20
previous?
? node
10
25
? tmp
18RICERCA
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
Algoritmo iterattivo
19VISUALIZZAZIONE
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
20SITO SLIDES
web.tiscali.it/ANDREAZ