Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Alberi Binari Ricerca, Appunti di Algoritmi E Strutture Di Dati

per comprendere al meglio la ricerca negli alberi binari

Tipologia: Appunti

2011/2012

Caricato il 10/07/2012

mingo5989
mingo5989 🇮🇹

4.5

(2)

6 documenti

1 / 40

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Alberi Binari di Ricerca
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28

Anteprima parziale del testo

Scarica Alberi Binari Ricerca e più Appunti in PDF di Algoritmi E Strutture Di Dati solo su Docsity!

Alberi Binari di Ricerca

Determinazione della chiave massima e minima

La chiave massima in un albero binario dovrà trovarsi

nel sottoalbero destro della radice

e nel sottoalbero destro del figlio destro della radice

e così via

Analogamente per la chiave minima che dovrà

essere nel sottoalbero sinistro

Pertanto per determinare l’elemento massimo è

sufficiente discendere tutti i nodi da figlio destro in

figlio destro fino ad arrivare alla foglia (e

analogamente con i figli sinistri per il minimo)

Minimo

Minimo=

Minimo e massimo

Tree Minimum(x)

1 while left[x]NIL

2 do xleft[x]

3 return x

Tree Maximum(x)

1 while right[x]NIL

2 do xright[x]

3 return x

Successore: idea intuitiva

Si considerano due casi:

il nodo x ha un figlio destro

il nodo x non ha un figlio destro

Nel primo caso:

si considera il sottoalbero destro che contiene sicuramente

nodi con chiavi maggiori della chiave di x

in questo sottoalbero il nodo con la chiave più piccola è la

foglia alla estrema sinistra, cioè il nodo restituito dalla

procedura Tree-Minimum

Successore di nodo con figlio dx

Successore di 15

minimo

sottoalbero

destro

Successore di nodo senza figlio dx

perché la chiave di p sia la più piccola possibile allora

p deve essere l’antenato più prossimo

altrimenti se consideriamo un antenato lontano è

vero che ha chiave maggiore, ma..

esisterà un antenato meno lontano e più piccolo!

Successore di x = 4

Antenati che hanno

x in sottoalbero sx

Idea intuitiva

Per determinare questo nodo antenato è sufficiente

risalire gli antenati di x fino a quando non si trova un

nodo antenato che è un figlio sinistro di un nodo y.

Il nodo y è il nodo cercato, il successore

Si mantengono pertanto i puntatori a due generici

antenati x e y e si risale fino a quando x=left[y]

PseudoCodice Successore

Tree Successore(x)

1 if right[x]NIL

2 thenreturn Tree Minimum(right[x])

3 yp[x]

4 while yNIL e x = right[y]

5 do xy

6 yp[x]

7 return y

Predecessore

La procedura per la determinazione del predecessore

è simmetrica a quella vista per il successore

il predecessore si troverà nel sottoalbero sinistro (se

questo esiste), e sarà l’elemento massimo di questo

sottoalbero

se non esiste sottoalbero sinistro il predecessore

sarà l’antenato più prossimo che ha un figlio destro

che è antenato del nodo in questione

Inserzione

Per inserire un nuovo valore k in un albero binario di

ricerca, si prepara un nodo z tale che:

possieda come chiave key[z]=k

e non abbia collegamenti left[z]=right[z]=p[k]=NIL

si cerca la posizione in cui inserirlo

si modificano i campi di z per allacciarlo all’albero

binario di ricerca

Inserzione

Per trovare la posizione giusta ci si muove a partire

dalla radice spostandosi sul sottoalbero destro o

sinistro come in una ricerca

si prosegue però fino ad arrivare ad un punto in cui

fallirebbe la ricerca

a questo punto si inserisce il nuovo nodo

Pseudocodice Inserzione

Tree-Insert(T,z)

1 y ← NIL

2 x ← root[T]

3 while x ≠ NIL

4 do y ← x

5 if key[z]<key[x]

6 then x ← left[x]

7 else x ← right[x]

8 p[z] ← y

9 if y=NIL

10 then root[T] ← z

11 else if key[z] < key[y]

12 then left[y] ← z

13 else right[y] ← z

ricerca della posizione

Pseudocodice Inserzione

Tree-Insert(T,z)

1 y ← NIL

2 x ← root[T]

3 while x ≠ NIL

4 do y ← x

5 if key[z]<key[x]

6 then x ← left[x]

7 else x ← right[x]

8 p[z] ← y

9 if y=NIL

10 then root[T] ← z

11 else if key[z] < key[y]

12 then left[y] ← z

13 else right[y] ← z

Inserzione del nodo z

caso: inserzione radice

caso: inserzione elemento generico

a dx o sx del nodo trovato