Alberi Binari di ricerca - Roma Tre...

39
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Alberi Binari di ricerca

Transcript of Alberi Binari di ricerca - Roma Tre...

Page 1: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Corso di Algoritmi e Strutture Dati

APPUNTI SUL LINGUAGGIO C

Alberi Binari di ricerca

Page 2: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca

La struttura ad albero binario si presta alla gestione di insiemi di dati su cui è definita una relazione d'ordine lineare.   alberi binari con dati ordinati sono detti Alberi Binari di Ricerca (BST = Binary

Search Trees)   Uso albero per ricerche con tecnica dicotomica. Si suppone che siano disponibili due funzioni Minore e Uguale in grado di verificare la relazione d'ordine e l'uguaglianza fra due atomi. Si suppone inoltre di non voler memorizzare nel BST due atomi uguali. Nella pratica, l’albero binario di ricerca si presta alla realizzazione della struttura astratta dizionario,   informazione memorizzata è partizionata in due componenti: chiave e

informazione associata.   relazione d’ordine e operazioni di confronto soltanto sulla base della chiave.

Page 3: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Rappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca

Se S è un insieme totalmente ordinato, lo rappresento come l’albero binario T avente per etichette gli elementi di S e tale che:

 per ogni a ∈ S, esiste un unico nodo v con etichetta a;

 per ogni nodo v di T: o  se u appartiene al sottoalbero di sinistra di v, allora l’etichetta di u è minore

dell’etichetta di v;

o  se u appartiene al sottoalbero di destra di v, allora l’etichetta di u è maggiore dell’etichetta di v.

o  l’ordinamento vale per tutti i sottoalberi (ordinamento a carattere ricorsivo)

Page 4: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Rappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca

Gli Alberi 9

/* IMPLEMENTAZIONE BST *//* albero binario di ricerca implem. conpuntatori */#include "InfoBase.h"#include "Bst.h"#include <stdlib.h>int BstStato;Posiz BstTrova(Bst B, Atomo A);void CancellaMin(Atomo *Min, Bst *B);/* BstCrea */void BstCrea(Bst *B){(*B) = NULL;

} /* end BstCrea */

OPERAZIONE DI INSERIMENTO

j

b l

f n

d h

j

b l

f n

d h m

Inserimento della chiave m

Si sfrutta il criterio di ordinamento per cercare il punto in cuiinserire un nuovo elemento con tecnica dicotomica

- se il l'albero considerato è vuoto crea un nodo el'albero diventa a un nodo,

altrimenti se l'oggetto da inserire è uguale allaradice - rifiuta l'inserimento

altrimenti se l'oggetto da inserire è < dellaradice - inserisce nel sottoalbero sinistro

altrimenti- inserisce nel sottoalbero destro

Il nuovo nodo sarà sempre inserito come foglia, quindi con i duesottoalberi vuoti.

Gli Alberi 11

/* impl. operazione inserimento *//* BstInserisci */int BstInserisci(Bst *B, Atomo A) {BstStato=BstChiaveEsistente;if (*B==NULL){ /* Creazione nodo */(*B)=(Bst)malloc(sizeof(Nodo));(*B)->Dato=A;(*B)->Sx=NULL;(*B)->Dx=NULL;BstStato=BstOK;

}elseif (Minore(A,(*B)->Dato))BstInserisci(&(*B)->Sx,A);

elseif (Minore((*B)->Dato,A))BstInserisci(&(*B)->Dx,A);

return BstStato;} /* end BstInserisci*/

OPERAZIONE DI AGGIORNAMENTO

L'operazione di aggiornamento richiede di trovare la posizione delnodo con chiave uguale a quella dell'atomo di ingresso.• si programma una funzione interna che restituisce la posizione

del nodo contenente un atomo assegnato• la funzione ricorsiva BstTrova realizza la ricerca dicotomica,

come semplice variazione della visita in pre-ordine centrale• la funzione BstRecupera restituisce quindi l'atomo A

corrispondente alla chiave cercata.• in caso di non ritrovamento della chiave, la funzione restituisce

lo stato di chiave assente.

Page 5: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca

Sono una struttura dati che consente di rappresentare un insieme (dinamico) totalmente ordinato. Le operazioni previste sono:

  ricerca di un elemento nell’insieme

  inserimento di un elemento nell’insieme

  cancellazione di un elemento dall’insieme

  ricerca del minimo e massimo dell’insieme

  successore e predecessore di un elemento nell’insieme

Page 6: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca

#define BstChiaveEsistente 1 /*In inser. per duplicati */ !#define BstChiaveAssente 2 /* In cancellaz. e recupero. */ !#define BstOK 0 !!static int BstStato = 0;!!typedef struct TNodo{ !

"Atomo Dato; !"struct TNodo *Sx; !"struct TNodo *Dx; !

} Nodo; !!typedef Nodo* Bst;

Page 7: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: inserimento

Si sfrutta il criterio di ordinamento per cercare il punto in cui inserire un nuovo elemento con tecnica dicotomica se l'albero considerato è vuoto crea un nodo e l'albero diventa un nodo, altrimenti

se l'oggetto da inserire è uguale alla radice   rifiuta l'inserimento

altrimenti se l'oggetto da inserire è < della radice

  inserisce nel sottoalbero sinistro altrimenti

  inserisce nel sottoalbero destro Il nuovo nodo sarà sempre inserito come foglia, quindi con i due sottoalberi vuoti.

Page 8: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: inserimento

Gli Alberi 9

/* IMPLEMENTAZIONE BST *//* albero binario di ricerca implem. conpuntatori */#include "InfoBase.h"#include "Bst.h"#include <stdlib.h>int BstStato;Posiz BstTrova(Bst B, Atomo A);void CancellaMin(Atomo *Min, Bst *B);/* BstCrea */void BstCrea(Bst *B){(*B) = NULL;

} /* end BstCrea */

OPERAZIONE DI INSERIMENTO

j

b l

f n

d h

j

b l

f n

d h m

Inserimento della chiave m

Si sfrutta il criterio di ordinamento per cercare il punto in cuiinserire un nuovo elemento con tecnica dicotomica

- se il l'albero considerato è vuoto crea un nodo el'albero diventa a un nodo,

altrimenti se l'oggetto da inserire è uguale allaradice - rifiuta l'inserimento

altrimenti se l'oggetto da inserire è < dellaradice - inserisce nel sottoalbero sinistro

altrimenti- inserisce nel sottoalbero destro

Il nuovo nodo sarà sempre inserito come foglia, quindi con i duesottoalberi vuoti.

Gli Alberi 11

/* impl. operazione inserimento *//* BstInserisci */int BstInserisci(Bst *B, Atomo A) {BstStato=BstChiaveEsistente;if (*B==NULL){ /* Creazione nodo */(*B)=(Bst)malloc(sizeof(Nodo));(*B)->Dato=A;(*B)->Sx=NULL;(*B)->Dx=NULL;BstStato=BstOK;

}elseif (Minore(A,(*B)->Dato))BstInserisci(&(*B)->Sx,A);

elseif (Minore((*B)->Dato,A))BstInserisci(&(*B)->Dx,A);

return BstStato;} /* end BstInserisci*/

OPERAZIONE DI AGGIORNAMENTO

L'operazione di aggiornamento richiede di trovare la posizione delnodo con chiave uguale a quella dell'atomo di ingresso.• si programma una funzione interna che restituisce la posizione

del nodo contenente un atomo assegnato• la funzione ricorsiva BstTrova realizza la ricerca dicotomica,

come semplice variazione della visita in pre-ordine centrale• la funzione BstRecupera restituisce quindi l'atomo A

corrispondente alla chiave cercata.• in caso di non ritrovamento della chiave, la funzione restituisce

lo stato di chiave assente.

Page 9: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: inserimento

/* impl. operazione inserimento */!/* BstInserisci */ !int BstInserisci(Bst *B, Atomo A) { !

"BstStato = BstChiaveEsistente; !"if (*B == NULL) { "/* Creazione nodo */!" "(*B) = (Bst)malloc(sizeof(Nodo)); !" "(*B)->Dato = A; !" "(*B)->Sx = NULL; !" "(*B)->Dx = NULL; !" "BstStato = BstOK; !"} !"else !" "if (Minore(A,(*B)->Dato)) BstInserisci(&(*B)->Sx,A); !"else !" "if (Minore((*B)->Dato,A)) BstInserisci(&(*B)->Dx,A); !"return BstStato; !

} /* end BstInserisci*/

Page 10: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

La forma dell’albero dipende dall’ordine di inserimento

Differenza tra l’albero ottenuto inserendo gli elementi in ordine, oppure in questa sequenza: 30 10 70 20 50 40 60!

La forma dell’albero dipende dall’ordine di inserimentodegli elementi!Differenza tra l’albero ottenuto inserendo gli elementi in ordine, oppure inquesta sequenza: 30 10 70 20 50 40 60

Violetta Lonati Alberi binari e alberi binari di ricerca AA 2009/2010 17/22

La forma dell’albero dipende dall’ordine di inserimentodegli elementi!Differenza tra l’albero ottenuto inserendo gli elementi in ordine, oppure inquesta sequenza: 30 10 70 20 50 40 60

Violetta Lonati Alberi binari e alberi binari di ricerca AA 2009/2010 17/22

Page 11: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca

La struttura ad albero binario si presta alla gestione di insiemi di dati su cui è definita una relazione d'ordine lineare.   alberi binari con dati ordinati sono detti Alberi Binari di Ricerca (BST = Binary

Search Trees)   Uso albero per ricerche con tecnica dicotomica. Si suppone che siano disponibili due funzioni Minore e Uguale in grado di verificare la relazione d'ordine e l'uguaglianza fra due atomi. Si suppone inoltre di non voler memorizzare nel BST due atomi uguali. Nella pratica, l’albero binario di ricerca si presta alla realizzazione della struttura astratta dizionario,   informazione memorizzata è partizionata in due componenti: chiave e

informazione associata.   relazione d’ordine e operazioni di confronto soltanto sulla base della chiave.

Page 12: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Rappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca

Se S è un insieme totalmente ordinato, lo rappresento come l’albero binario T avente per etichette gli elementi di S e tale che:

 per ogni a ∈ S, esiste un unico nodo v con etichetta a;

 per ogni nodo v di T: o  se u appartiene al sottoalbero di sinistra di v, allora l’etichetta di u è minore

dell’etichetta di v;

o  se u appartiene al sottoalbero di destra di v, allora l’etichetta di u è maggiore dell’etichetta di v.

o  l’ordinamento vale per tutti i sottoalberi (ordinamento a carattere ricorsivo)

Page 13: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Rappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca

Gli Alberi 9

/* IMPLEMENTAZIONE BST *//* albero binario di ricerca implem. conpuntatori */#include "InfoBase.h"#include "Bst.h"#include <stdlib.h>int BstStato;Posiz BstTrova(Bst B, Atomo A);void CancellaMin(Atomo *Min, Bst *B);/* BstCrea */void BstCrea(Bst *B){(*B) = NULL;

} /* end BstCrea */

OPERAZIONE DI INSERIMENTO

j

b l

f n

d h

j

b l

f n

d h m

Inserimento della chiave m

Si sfrutta il criterio di ordinamento per cercare il punto in cuiinserire un nuovo elemento con tecnica dicotomica

- se il l'albero considerato è vuoto crea un nodo el'albero diventa a un nodo,

altrimenti se l'oggetto da inserire è uguale allaradice - rifiuta l'inserimento

altrimenti se l'oggetto da inserire è < dellaradice - inserisce nel sottoalbero sinistro

altrimenti- inserisce nel sottoalbero destro

Il nuovo nodo sarà sempre inserito come foglia, quindi con i duesottoalberi vuoti.

Gli Alberi 11

/* impl. operazione inserimento *//* BstInserisci */int BstInserisci(Bst *B, Atomo A) {BstStato=BstChiaveEsistente;if (*B==NULL){ /* Creazione nodo */(*B)=(Bst)malloc(sizeof(Nodo));(*B)->Dato=A;(*B)->Sx=NULL;(*B)->Dx=NULL;BstStato=BstOK;

}elseif (Minore(A,(*B)->Dato))BstInserisci(&(*B)->Sx,A);

elseif (Minore((*B)->Dato,A))BstInserisci(&(*B)->Dx,A);

return BstStato;} /* end BstInserisci*/

OPERAZIONE DI AGGIORNAMENTO

L'operazione di aggiornamento richiede di trovare la posizione delnodo con chiave uguale a quella dell'atomo di ingresso.• si programma una funzione interna che restituisce la posizione

del nodo contenente un atomo assegnato• la funzione ricorsiva BstTrova realizza la ricerca dicotomica,

come semplice variazione della visita in pre-ordine centrale• la funzione BstRecupera restituisce quindi l'atomo A

corrispondente alla chiave cercata.• in caso di non ritrovamento della chiave, la funzione restituisce

lo stato di chiave assente.

Page 14: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca

Sono una struttura dati che consente di rappresentare un insieme (dinamico) totalmente ordinato. Le operazioni previste sono:

  ricerca di un elemento nell’insieme

  inserimento di un elemento nell’insieme

  cancellazione di un elemento dall’insieme

  visita ordinata dell’insieme

  ricerca del minimo e massimo dell’insieme

  successivo e predecedente di un elemento nell’insieme

Page 15: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca

#define BstChiaveEsistente 1 /*In inser. per duplicati */ !#define BstChiaveAssente 2 /* In cancellaz. e recupero. */ !#define BstOK 0 !!static int BstStato = 0;!!typedef struct TNodo{ !

"Atomo Dato; !"struct TNodo *Sx; !"struct TNodo *Dx; !

} Nodo; !!typedef Nodo* Bst;

Page 16: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: inserimento

Si sfrutta il criterio di ordinamento per cercare il punto in cui inserire un nuovo elemento con tecnica dicotomica se l'albero considerato è vuoto crea un nodo e l'albero diventa un nodo, altrimenti

se l'oggetto da inserire è uguale alla radice   rifiuta l'inserimento

altrimenti se l'oggetto da inserire è < della radice

  inserisce nel sottoalbero sinistro altrimenti

  inserisce nel sottoalbero destro Il nuovo nodo sarà sempre inserito come foglia, quindi con i due sottoalberi vuoti.

Page 17: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: inserimento

Gli Alberi 9

/* IMPLEMENTAZIONE BST *//* albero binario di ricerca implem. conpuntatori */#include "InfoBase.h"#include "Bst.h"#include <stdlib.h>int BstStato;Posiz BstTrova(Bst B, Atomo A);void CancellaMin(Atomo *Min, Bst *B);/* BstCrea */void BstCrea(Bst *B){(*B) = NULL;

} /* end BstCrea */

OPERAZIONE DI INSERIMENTO

j

b l

f n

d h

j

b l

f n

d h m

Inserimento della chiave m

Si sfrutta il criterio di ordinamento per cercare il punto in cuiinserire un nuovo elemento con tecnica dicotomica

- se il l'albero considerato è vuoto crea un nodo el'albero diventa a un nodo,

altrimenti se l'oggetto da inserire è uguale allaradice - rifiuta l'inserimento

altrimenti se l'oggetto da inserire è < dellaradice - inserisce nel sottoalbero sinistro

altrimenti- inserisce nel sottoalbero destro

Il nuovo nodo sarà sempre inserito come foglia, quindi con i duesottoalberi vuoti.

Gli Alberi 11

/* impl. operazione inserimento *//* BstInserisci */int BstInserisci(Bst *B, Atomo A) {BstStato=BstChiaveEsistente;if (*B==NULL){ /* Creazione nodo */(*B)=(Bst)malloc(sizeof(Nodo));(*B)->Dato=A;(*B)->Sx=NULL;(*B)->Dx=NULL;BstStato=BstOK;

}elseif (Minore(A,(*B)->Dato))BstInserisci(&(*B)->Sx,A);

elseif (Minore((*B)->Dato,A))BstInserisci(&(*B)->Dx,A);

return BstStato;} /* end BstInserisci*/

OPERAZIONE DI AGGIORNAMENTO

L'operazione di aggiornamento richiede di trovare la posizione delnodo con chiave uguale a quella dell'atomo di ingresso.• si programma una funzione interna che restituisce la posizione

del nodo contenente un atomo assegnato• la funzione ricorsiva BstTrova realizza la ricerca dicotomica,

come semplice variazione della visita in pre-ordine centrale• la funzione BstRecupera restituisce quindi l'atomo A

corrispondente alla chiave cercata.• in caso di non ritrovamento della chiave, la funzione restituisce

lo stato di chiave assente.

Page 18: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: inserimento

/* impl. operazione inserimento */!/* BstInserisci */ !int BstInserisci(Bst *B, Atomo A) { !

"BstStato = BstChiaveEsistente; !"if (*B == NULL) { "/* Creazione nodo */!" "(*B) = (Bst)malloc(sizeof(Nodo)); !" "(*B)->Dato = A; !" "(*B)->Sx = NULL; !" "(*B)->Dx = NULL; !" "BstStato = BstOK; !"} !"else !" "if (Minore(A,(*B)->Dato)) BstInserisci(&(*B)->Sx,A); !"else !" "if (Minore((*B)->Dato,A)) BstInserisci(&(*B)->Dx,A); !"return BstStato; !

} /* end BstInserisci*/

Page 19: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

La forma dell’albero dipende dall’ordine di inserimento

Differenza tra l’albero ottenuto inserendo gli elementi in ordine, oppure in questa sequenza: 30 10 70 20 50 40 60!

La forma dell’albero dipende dall’ordine di inserimentodegli elementi!Differenza tra l’albero ottenuto inserendo gli elementi in ordine, oppure inquesta sequenza: 30 10 70 20 50 40 60

Violetta Lonati Alberi binari e alberi binari di ricerca AA 2009/2010 17/22

La forma dell’albero dipende dall’ordine di inserimentodegli elementi!Differenza tra l’albero ottenuto inserendo gli elementi in ordine, oppure inquesta sequenza: 30 10 70 20 50 40 60

Violetta Lonati Alberi binari e alberi binari di ricerca AA 2009/2010 17/22

Page 20: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: aggiornamento

L'operazione di aggiornamento richiede di trovare la posizione del nodo con chiave uguale a quella dell'atomo di ingresso e aggiornare il suo valore.

o  si programma una funzione interna che restituisce la posizione (il puntatore) del nodo contenente un atomo assegnato

o  la funzione ricorsiva BstTrova realizza la ricerca dicotomica, come semplice variazione della visita in preordine

o  la funzione BstRecupera restituisce quindi l'atomo A corrispondente alla chiave cercata e lo modifica con il nuovo atomo N.

o  in caso di non ritrovamento della chiave, la funzione restituisce lo stato di chiave assente.

Page 21: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: aggiornamento

/* BstTrova: usato solo internamente */!Bst BstTrova(Bst B, Atomo A) { ! BstStato = BstOK; /* verra' cambiato valore !

" " " " " " solo se necessario */ !"if (B == NULL){ !" "BstStato = BstChiaveAssente; !" "return NULL; !"} !"else if (Uguale(B->Dato,A)) return B; !" else!" "if (Minore(A,B->Dato)) return BstTrova(B->Sx,A); !" "else return BstTrova(B->Dx,A); !

} /* end BstTrova */!!/* BstRecupera */ !int BstRecupera(Bst B, Atomo A, Atomo N) { !

"Bst P; !"P = BstTrova(B,(A)); !"P->Dato = N; !"return BstStato; !

} /* end BstRecupera */

Page 22: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: cancellazione

La cancellazione di un nodo qualunque N dell'albero pone due problemi: a)  non perdere i sottoalberi di N e reinserirli nell'albero b)  garantire il mantenimento del criterio di ordinamento dell'albero.

Occorre distinguere diversi casi, a seconda che N sia foglia oppure abbia uno o due sottoalberi non vuoti:   se N è foglia non è necessaria alcuna azione correttiva per mantenere la

condizione di BST;   se N non è foglia è necessario modificare la struttura dell'albero, tenendo conto

che l'atomo minimo del sottoalbero destro di N, che chiameremo MinDx(N), partiziona i valori dell'albero che ha radice in N: i valori del sottoalbero sinistro di N sono tutti minori di MinDx(N)

  se N ha due figli, può essere sostituito dal minimo del suo sottoalbero destro MinDx(N)

  se N ha un solo figlio può essere direttamente sostituito dal figlio

Page 23: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: cancellazione

Gli Alberi 13

AGGIORNAMENTO/* BstTrova: usato solo internamente */Posiz BstTrova(Bst B, Atomo A) {BstStato=BstOK; /* verra' cambiato valore

solo se necessario */ if (B==NULL){ BstStato=BstChiaveAssente;

return NULL;}elseif (Uguale(B->Dato,A))return (Posiz)B;

elseif (Minore(A,B->Dato))return (Posiz)BstTrova(B->Sx,A);

elsereturn (Posiz)BstTrova(B->Dx,A);

} /* end BstTrova *//* BstRecupera */int BstRecupera(Bst B, Atomo *A) {Posiz P;P=BstTrova(B,(*A));*A=(P->Dato);return BstStato;

} /* end BstRecupera */

CANCELLAZIONE DI UN NODO

La cancellazione di un nodo qualunque N dell'albero pone dueproblemi:

a) non perdere i sottoalberi di N, reinserendoli nell'alberob) garantire il mantenimento del criterio di ordinamento

dell'albero.

Occorre distinguere diversi casi, a seconda che N sia foglia oppureabbia uno o due sottoalberi non vuoti:• se N è foglia non è necessaria alcuna azione correttiva per

mantenere la condizione di BST;• se N non è foglia è necessario modificare la struttura dell'albero,

tenendo conto che l'atomo minimo del sottoalbero destro di N, chechiameremo MinDx(N), partiziona i valori dell'albero che haradice in N: i valori del sottoalbero sinistro di N sono tutti minoridi MinDx(N)

• se N ha due figli, può essere sostituito dal minimo del suosottoalbero destro MinDx(N)

• se N ha un solo figlio può essere direttamente sostituito dal figlio

j

b l

f n

d h

g

j

b l

nh

j

b l

n

d h

g

Gli Alberi 15

ALGORITMO DI CANCELLAZIONE

Richiede:• l'individuazione la cancellazione del nodo con chiave minima di

un sottoalbero, per mantenere la proprietà di ordinamento,secondo il seguente algoritmo

• si mostra solo la cancellazione della radice di un albero; lacancellazione di un nodo qualunque dell’albero sarà precedutada una fase di ricerca):

- se la radice ha due sottoalberi non vuoti - cancella il nodo con chiave minima ememorizzane il contenuto Min

- sostituisci al contenuto della radice ildato Min

altrimenti - se c’è soltanto il sottoalbero sinistro - sostituisci alla radice il suo figliosinistro

altrimenti - se c’è soltanto il sottoalbero destro - sostituisci alla radice il suo figliodestro

altrimenti - cancella la radice, poiché è unafoglia

CANCELLAZIONE /* BstCancella */int BstCancella(Bst *B, Atomo A) {Posiz Temp;Atomo Min;BstStato=BstOK;if ((*B)==NULL)BstStato = BstChiaveAssente;

elseif (Minore(A,(*B)->Dato))BstCancella(&(*B)->Sx,A);

elseif (Minore((*B)->Dato,A))BstCancella(&(*B)->Dx,A);

else{ /*B punta al nodo che contiene A */if (((*B)->Sx!=NULL) && ((*B)-

>Dx!=NULL)){ /* Ci sono entrambi i sottoalberi

*/CancellaMin(&Min,&(*B)->Dx);(*B)->Dato=Min;

}

Page 24: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: cancellazione

La cancellazione di un nodo qualunque N richiede:   l'individuazione del nodo con chiave minima di un sottoalbero, per mantenere la proprietà di ordinamento   si mostra solo la cancellazione della radice di un albero; la cancellazione di un nodo qualunque dell’albero sarà preceduta da una fase di ricerca

se la radice ha due sottoalberi non vuoti o  cancella il nodo con chiave minima e memorizzane il contenuto Min o  sostituisci al contenuto della radice il dato Min

altrimenti se c’è soltanto il sottoalbero sinistro

o  sostituisci alla radice il suo figlio sinistro

altrimenti se c’è soltanto il sottoalbero destro

o  sostituisci alla radice il suo figlio destro

altrimenti o  cancella la radice, poiché è una foglia

Page 25: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: cancellazione /* BstCancella */ !int BstCancella(Bst *B, Atomo A) { !

"Bst Temp; Atomo Min; BstStato = BstOK; !"if ((*B) == NULL) BstStato = BstChiaveAssente; !"else !" if (Minore(A,(*B)->Dato)) BstCancella(&(*B)->Sx,A); !" else !" " if (Minore((*B)->Dato,A)) BstCancella(&(*B)->Dx,A); !" " else{ /*B punta al nodo che contiene A */!" " "if (((*B)->Sx!=NULL) && ((*B)->Dx!=NULL)) !" " "{ "/* Ci sono entrambi i sottoalberi*/!" " " "CancellaMin(&Min,&(*B)->Dx); !" " " "(*B)->Dato=Min; !" " "} !" " "else!" " "{ "/* c'e' al piu' un figlio, Sx o Dx*/!" " " " Temp = (*B); !" " " " if ((*B)->Sx != NULL) !" " " " " (*B) = (*B)->Sx; "/* solo sottoalb. Sx */!" " " " else !" " " " " if ((*B)->Dx!=NULL) !" " " " " (*B)=(*B)->Dx; /* solo sottoalb. Dx */!" " " " " else /* il nodo e' una foglia: "*/!" " " " " (*B)=NULL; /* eliminazione diretta */!" " " "free(Temp); !" " "} !" " } !"return BstStato; !

} /* end CancellaBst */

Page 26: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: cancellazione

L'operazione CancellaMin per cancellare il nodo con chiave minima dell'albero non ha rilevanza di per se, pertanto non è stata inclusa, fra le operazioni di base. L'elemento minimo Min di un BST è nel nodo più a sinistra e valgono le seguenti proprietà:   Min è figlio sinistro del genitore;   Min può essere:

  foglia,   non foglia: in tal caso avrà soltanto un figlio destro (radice di un sottoalbero);

  tutti i nodi del sottoalbero destro di Min hanno chiavi minori della chiave del genitore di Min;

  all'eliminazione del nodo contenente Min il suo figlio destro può divenire figlio sinistro del genitore del nodo eliminato.

Gli Alberi 17

/* CONTINUA BstCancella */else{ /* c'e' al piu' un figlio, Sx o Dx

*/Temp=(*B);if ((*B)->Sx!=NULL)(*B)=(*B)->Sx; /* solo sottoalb. Sx

*/elseif ((*B)->Dx!=NULL)(*B)=(*B)->Dx; /* solo sottoalb. Dx

*/else /* il nodo e' una foglia: */(*B)=NULL; /* eliminazione

diretta */free(Temp);

}}

return BstStato;} /* end CancellaBst */

CANCELLAZIONE (continua..)

L'operazione CancellaMin per cancellare il nodo con chiaveminima dell'albero non ha rilevanza di per se, pertanto non è statainclusa, fra le operazioni di base.

L'elemento minimo Min di un BST è nel nodo più a sinistra evalgono le seguenti proprietà:• Min è figlio sinistro del genitore;• Min può essere:• foglia,• non foglia: in tal caso avrà soltanto un figlio destro (radice di un

sottoalbero);• tutti i nodi del sottoalbero destro di Min hanno chiavi minori della

chiave del genitore di Min;• all'eliminazione del nodo contenente Min il suo figlio destro può

divenire figlio sinistro del genitore del nodo eliminato.

j

b l

f n

d h

j

lf

nd h

Gli Alberi 19

/* CancellaMin: uso interno */void CancellaMin(Atomo *Min, Bst *B){Posiz Temp;

if ((*B)!=NULL)if ((*B)->Sx!=NULL)CancellaMin(Min,&(*B)->Sx);

else{ /* B punta al nodo con il minimo

*/Temp=*B;*Min=(*B)->Dato;*B=(*B)->Dx;free(Temp);

}} /* end CancellaMin */

Quando sono presenti entrambi i sottoalberi, l'eliminazione fisica(con free) di un nodo è eseguita dalla CancellaMin

La Cancella sostituisce nel nodo da cancellare effettivamentel'atomo restituito come parametro di uscita da CancellaMin. Neglialtri casi la Cancella esegue l’eliminazione diretta dal nodo.

VISUALIZZAZIONE ORDINATA BST

Procedura di visualizzazione completa e ordinata di un BST:• semplice visita in ordine simmetrico.

/* VisitaOrdinata */void VisitaOrdinata(Bst B) {if (B!=NULL){VisitaOrdinata(B->Sx);Visualizza(B->Dato);VisitaOrdinata(B->Dx);

}} /* end VisitaOrdinata */

Page 27: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: CancellaMin /* CancellaMin: uso interno */ !void CancellaMin(Atomo *Min, Bst *B){ !

"Bst Temp; !"if ((*B)!=NULL) !" if ((*B)->Sx!=NULL) !" "CancellaMin(Min,&(*B)->Sx); !" else!" { "/* B punta al nodo con il minimo */!" "Temp=*B; !" "*Min=(*B)->Dato; !" "*B=(*B)->Dx; !" "free(Temp); !" } !

} /* end CancellaMin */

Quando sono presenti entrambi i sottoalberi, l'eliminazione fisica (con free) di un nodo è eseguita dalla CancellaMin Cancella sostituisce nel nodo da cancellare effettivamente l'atomo restituito come parametro di uscita da CancellaMin. Negli altri casi Cancella esegue l’eliminazione diretta dal nodo.

Page 28: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: Visualizzazione ordinata

/* VisitaOrdinata */ !void VisitaOrdinata(Bst B) { !

"if (B!=NULL) { !" "VisitaOrdinata(B->Sx); !" "Visualizza(B->Dato); !" "VisitaOrdinata(B->Dx); !"} !

} /* end VisitaOrdinata *

Procedura di visualizzazione completa e ordinata di un BST:  semplice visita in ordine simmetrico.

Page 29: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: Ricerca di Min e Max

/* calcolo del Min */ !Atomo Min(Bst B) { !

"if (B->Sx == NULL) return B->Dato; ! else Min(B->Sx); !} /* end */ !!!/* calcolo del Max */ !Atomo Max(Bst B) { !

"if (B->Dx == NULL) return B->Dato; ! else Max(B->Dx); !} /* end */ !

Procedure di calcolo del minimo e del massimo in un BST:  semplice visita nei sottoalberi sinistro e destro.

Page 30: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: successivo di un elemento

BST: definizione

Operazioni su BST

ricerca

massimo e mimino

successore e predecessore

inserimento

cancellazione

Successore e Predecessore

! !

!

"

#

$!

$"

% $&

$#

!"##$%%&'$()#*%&(+,'()(*+(,-(./00/+1234/(53.04/(

6,773../48)9(:(

;433<=>->?,?84>@*0A)B9((:($#

Di Berardini, Merelli Algoritmi e Strutture Dati

Se l’elemento x ha un sottoalbero destro Dx allora calcolare il Min di Dx

Page 31: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: successivo di un elemento

l’elemento x non ha un sottoalbero destro Dx, ma ha un successivo y. Bisogna calcolare l’antenato y più prossimo di x il cui figlio sinistro è anche un antenato di x

BST: definizione

Operazioni su BST

ricerca

massimo e mimino

successore e predecessore

inserimento

cancellazione

Successore e Predecessore

! !

!

"

#

$!

$"

% $&

$#

!"##$%%&'$()#*%&(+,'()(*+*(,-(.*(/+00+-1234+(53/04+6(7-((

,-((.*(/.883//+43(9(

9(:(1;-*03*-0+(<=>(<4+//=7+

5=()(=1(8.=(?=@1=+(/=*=/04+(A(

-*8,3(.*(-*03*-0+(/=()(

Di Berardini, Merelli Algoritmi e Strutture Dati

Page 32: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca

#define BstChiaveEsistente 1 /*In inser. per duplicati */ !#define BstChiaveAssente 2 /* In cancellaz. e recupero. */ !#define BstOK 0 !!static int BstStato = 0;!!typedef struct TNodo{ !

"Atomo Dato; !"struct TNodo *P; /* Aggiungiamo il riferimento al padre. */ !"struct TNodo *Sx; !"struct TNodo *Dx; !

} Nodo; !!typedef Nodo* Bst;

Page 33: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: successivo di un elemento

/* calcolo del successivo: si ipotizza di dare in input il sottoalbero Bx radicato in x */ !!Atomo Tree-succ(Bst Bx) { !

"if (Bx->Dx != NULL) return Min(Bx->Dx); ! else { !!

Bst By = Bx->P; !while ((Bx != NULL) && (Bx == By->Dx)) { !

Bx = By; !By = Bx->P; !

} !!return By->Dato; !} !

!} /* end */ !

Page 34: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Alberi Binari di ricerca: precedente di un elemento

L’algoritmo per il calcolo del predecessore di un dato elemento dell’insieme è del tutto simmetrico. Seguiamo il puntatore P dal nodo x fino, al più, alla radice

Page 35: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Complessità delle operazioni su alberi

Tutte le operazioni su alberi, ad eccezione della creazione, vengono eseguite in tempo O(h), dove h è la profondità dell'albero. Prova intuitiva: le procedure viste ①  non contengono cicli ②  sono ricorsive ed eseguono sempre una singola navigazione verso il basso, ③  terminano quando viene incontrata una foglia. Per effetto del secondo e del terzo punto   il numero di attivazioni di procedura è sempre uguale alla profondità di una

foglia   l’assenza di cicli interni alle procedure rende la complessità di caso peggiore

delle singole chiamate costante rispetto alle dimensioni del problema.

Page 36: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Complessità delle operazioni su alberi: visioni alternative

Sarebbe più interessante esprimere la complessità delle operazioni in funzione di una dimensione più significativa, quale il numero di nodi n dell’albero, ma il legame fra n e h non è noto a priori, poiché:   la forma dell'albero dipende dall'ordine degli inserimenti, come mostrato in

figura

Gli Alberi 25

VisitaOrdinata(B);printf("Ciclo di ricerca\n");do { /* ripeti finche’ atomo non nullo */AcquisisciChiave(&A);if (!AtomoNullo(A)){if(BstRecupera(B,&A)){/* l’unico err.

possibile e’ quello di “chiave assente” */printf("Chiave inesistente\n");

}else{Visualizza(A);

}}

} while (!AtomoNullo(A));printf("Ciclo di cancellazione\n");do { /* ripeti finche’ atomo non nullo */AcquisisciChiave(&A);if (!AtomoNullo(A)){if(BstCancella(&B,A)){/* l’unico err.

possibile e’ quello di “chiave assente” */

printf("Chiave inesistente\n");}

else VisitaOrdinata(B); /* in caso disuccesso mostra l’albero dopo la cancell. */

}} while (!AtomoNullo(A));printf("Fine Lavoro");return 0;

}

Complessità delle operazioni su alberi

Tutte le operazioni su alberi, ad eccezione della creazione, vengonoeseguite in tempo O(h), dove h è la profondità dell'albero.

Prova intuitiva: le procedure viste• non contengono cicli,• sono ricorsive ed eseguono sempre una singola navigazione verso

il basso,• terminano quando viene incontrata una foglia.

Per effetto del secondo e del terzo punto• il numero di attivazioni di procedura è sempre uguale alla

profondità di una foglia• l’assenza di cicli interni alle procedure rende la complessità di

caso peggiore delle singole chiamate costante rispetto alledimensioni del problema. N

Gli Alberi 27

Complessità delle operazioni su alberi: Visioni Alternative

Sarebbe più interessante esprimere la complessità delle operazioniin funzione di una dimensione più significativa, quale il numero dinodi n dell’albero, ma il legame fra n e h non è noto a priori, poiché:

• la forma dell'albero dipende dall'ordine degli inserimenti, comemostrato in figura

Albero generato dalla sequenzaj,d,b,g,n,l,q;

quali altre sequenze lo generano?

j

b l

nh

j

b

nd

g l q

Albero generato dalla sequenzab,d,g,j,l,n,q;

quali altre sequenze generano unalbero di profondità massima?

j

l

n

n

n

n

nq

b

d

g

j

l

n

In particolare, il massimo valore di h è n-1,• nel caso peggiore la complessità diventa lineare.

Viceversa• h è minima se tutti i percorsi dalla radice alle foglie hanno

lunghezza h-1 o h.

Supponendo che tutti i percorsi siano uguali di lunghezza h, vale larelazione n = 2h+1-1, quindi se h è minima h è O(log n), e quindi• le operazioni hanno complessità O(log n).

Albero bilanciato

Per garantire che le operazioni abbiano una complessità logaritmicaesistono due possibilità:• fidarsi di un comportamento casuale che genera un albero di

profondità quasi minima,• intraprendere azioni correttive durante la costruzione dell'albero in

caso di sbilanciamento.

Un albero è bilanciato se:• ad ogni nodo la differenza fra le profondità dei suoi due

sottoalberi è al più 1.La profondità di un albero bilanciato è sempre O(log n).

Un albero bilanciato può essere ottenuto per ridefinizione delleoperazioni su BST: in questo caso si parla di AVL-tree (dai nomi degliinventori Adel'son-Velskii e Landis, 1962).• gli algoritmi di inserimento e cancellazione sono estesi con

operazioni di soccorso, chiamate per ristabilire il bilanciamento incaso di necessità.

• le operazioni di soccorso si basano sul concetto di rotazione diuna porzione di albero, come mostrato in figura

• la struttura di un nodo deve venire estesa per contenere l'altezzadel sottoalbero di cui il nodo è radice.

j

b l

n

h

10

4 14

12 17

22 !b

l

n

h

10

4

14

12

17

22

Page 37: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Complessità delle operazioni su alberi: visioni alternative

In particolare, il massimo valore di h è n-1   nel caso peggiore la complessità diventa lineare. Viceversa   h è minima se tutti i percorsi dalla radice alle foglie hanno lunghezza h-1 o h. Supponendo che tutti i percorsi siano uguali di lunghezza h, vale la relazione n = 2h+1-1, quindi se h è minima h è O(log n), e quindi   le operazioni hanno complessità O(log n)

Page 38: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Trasformazione di alberi in alberi binari di ricerca !"#$%&"'#()&*+,-),#./+")

)*,#./+"),/)*#")0

1

2

34

5

0

1 3

4 5 2

! "

67 8.),)*$)+'),-),*&-),-),! +," 9&)*9)-&*&:;7 <#,"#-)9+,-),! 9&)*9)-+,9&*,.#,"#-)9+,-),":=7 >?*),*&-&,! -)," @#,9&'+,"#-)9+,-+.,$&AA&#./+"&,$)*)$A"&,).,B")'&,%)?.)&,-),! )*,!

+,9&'+,"#-)9+,-+.,$&AA&#./+"&,-+$A"&,).,%"#A+..&,$C99+$$)D&,#,-+$A"#,-),! )*,!EF+,! *&*,@#,),%)?.),G%"#A+..),#,-+$A"#7,)*,!H,).,$&AA&#./+"&,$)*)$A"&,G-+$A"&7,-),! )*,"I,DC&A&E

  Gli insiemi di nodi di S e T coincidono;   La radice di S coincide con la radice di T;   Ogni nodo n di T

o  ha come radice del sottoalbero sinistro il primo figlio di n in S o  e come radice del sottoalbero destro il fratello successivo a destra di n

in S. o  Se n non ha i figli (fratelli a destra) in S, il sottoalbero sinistro (destro) di

n in T è vuoto.

Page 39: Alberi Binari di ricerca - Roma Tre Universitypatrigna/asd/asd5cfu/Materiale_Linguaggio_C/ABR.pdfRappresentazione di insiemi totalmente ordinati tramite Alberi Binari di ricerca Se

Corso di Algoritmi e strutture Dati

APPUNTI SUL LINGUAGGIO C

Alberi Binari di ricerca

FINE