Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli...

16
Visite di alberi binari Laboratorio di Algoritmi e Strutture Dati

Transcript of Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli...

Page 1: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visite di alberi binariLaboratorio di Algoritmi e Strutture Dati

Page 2: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita di Alberi

Gli alberi possono essere visitati (o attraversati)

in diversi modi:

•Visita in Preordine: prima si visita il nodo e poi i

suoi sottoalberi;

•Visita Inordine (se binario): prima si visita il

sottoalbero sinistro, poi il nodo e infine il

sottoalbero destro;

•Visita in Postordine : prima si visitano i

sottoalberi, poi il nodo.

Page 3: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita di Alberi Binari: in profondità preordine

Visita-Preordine(T)

IF T ≠ NIL THEN

“vista T”

Visita-Preordine(T->sx)

Visita-Preordine(T->dx)

a

b e

c d f g

Sequenza: a b c d e f g

T

node

sx

key

dx

Page 4: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita di Alberi Binari: in profondità preordine

Visita-Preordine(node *T) {

IF (T) {

Vista(T);

Visita-Preordine(T->sx);

Visita-Preordine(T->dx);

}

}

a

b e

c d f g

Sequenza: a b c d e f g

T

node

sx

key

dx

Page 5: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita di Alberi Binari: in profondità inordine

Visita-Inordine(T)

IF T ≠ NIL THEN

Visita-Inordine(T->sx)

“vista T”

Visita-Inordine(T->dx)

a

b e

c d f g

Sequenza: c b d a f e g

T

Page 6: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita di Alberi Binari: in profondità postordine

Visita-Postordine(T)

IF T ≠ NIL THEN

Visita-Postordine(T->sx)

Visita-Postordine(T->dx)

“vista T”

a

b e

c d f g

Sequenza: c d b f g e a

T

Page 7: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita Preorder IterativaVisita-preorder-iter(T)

stack = NIL

curr = T

WHILE (stack ≠ NIL OR curr ≠ NIL) DO

IF (curr ≠ NULL) THEN /* Discesa sx */

“vista curr”

push(stack,curr)

curr = curr->sx

ELSE /* Discesa dx */

curr = top(stack)

pop(stack)

curr = curr->dx

Page 8: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita-preorder-iter(node * T) {

stack *st = NULL;

node *curr = T;

while(st || curr) {

if(curr) { /* Visita e discesa a sx */

Visita(curr);

st = push(st,curr);

curr = curr->sx

} else { /* Discesa a dx */

curr = top(st);

st = pop(st);

curr = curr->dx;

}

}

}

Page 9: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita-preorder-iter2(node * T) {

stack *st = NULL;

node *curr = T;

while(curr) {

Visita(curr);

if(curr->dx) /* Salva per discesa a dx */

st = push(st,curr->dx);

if (curr->sx) /* Discesa a sx */

curr = curr->sx

else { /* Discesa a dx */

if (st) {

curr = top(st);

st = pop(st);

}

else curr = NULL;

} } }

Page 10: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita Inorder IterativaVisita-inorder-iter(T)

stack = NIL

curr = T

WHILE (stack ≠ NIL OR curr ≠ NIL) DO

IF (curr ≠ NULL) THEN /* Discesa sx */

push(stack,curr)

curr = curr->sx

ELSE /* Discesa dx */

curr = top(stack)

pop(stack)

“vista curr”

curr = curr->dx

Page 11: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita-inorder-iter(node * T) {

stack *st = NULL;

node *curr = T;

while(st || curr) {

if(curr) { /* Discesa a sx */

st = push(st,curr);

curr = curr->sx

}

else { /* Visita e discesa a dx */

curr = top(st);

st = pop(st);

Visita(curr);

curr = curr->dx;

} } }

Page 12: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita-inorder-iter2(node *T) {

stack *st = NULL;

node *curr, *last = NULL;

if (T) st = push(T);

while (st) { /* Discesa lungo l’albero corrente */

curr = top(st);

if (!last || curr == last->sx || curr == last->dx) {

if (curr->sx) st = push(st,curr->sx);

else {

Visita(curr);

st = pop(st);

if (curr->dx) st = push(st,curr->dx);

}

else if (last == curr->sx){ /* Risalita da sinistra */

Visita(curr);

if (curr->dx) st = push(st,curr->dx);

else if (last == curr->dx) st = pop(st); /* Risalita da destra */

last = curr;

}}

Page 13: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita Postorder IterativaVisita-postorder-iter(T)

stack = NIL

curr = T, last = NIL

WHILE (stack ≠ NIL OR curr ≠ NIL) DO

IF (curr ≠ NIL) THEN /* Discesa sx */

push(stack,curr)

curr = curr->sx

ELSE

curr = top(stack) /* Risalita */

IF (curr->dx = NIL OR last = curr->dx) THEN

“vista curr”

last = curr

pop(stack)

curr = NIL

ELSE curr = curr->dx /* Discesa dx */

Page 14: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita-postorder-iter(node * T) {

stack *st = NULL;

node *last, curr = T;

while(st || curr) {

if(curr) { /* Discesa a sx */

st = push(st,curr);

curr = curr->sx

}

else { /* Visita o discesa a dx */

curr = top(st);

if (!curr->dx || last == curr->dx){

Visita(curr);

last = curr;

st = pop(st);

curr = NULL;

}

else curr = curr->dx; /* Discesa a dx */

}}}

Page 15: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Visita-postorder-iter2(node *T) {

stack *st = NULL;

node *curr, *last = NULL;

if (T) st = push(T);

while (st) { /* Discesa lungo l’albero corrente */

curr = top(st);

if (!last || curr == last->sx || curr == last->dx) {

if (curr->sx) st = push(st,curr->sx);

else if (curr->dx) st = push(st,curr->dx);

else {

Visita(curr); st = pop(st);

} }

else if (last == curr->sx){ /* Risalita da sinistra */

if (curr->dx) st = push(st,curr->dx);

else { Visita(curr); st = pop(st); }

else if (last == curr->dx){ /* Risalita da destra */

Visita(curr); st = pop(st);

}

last = curr;

} }

Page 16: Visite di alberi binariwpage.unina.it/benerece/LASD-2016/4-Visite di alberi...Visita di Alberi Gli alberi possono essere visitati (o attraversati) in diversi modi: •Visita in Preordine:

Esercizio 3

• Si realizzi una libreria per la gestione di Alberi Binari di

Ricerca Generici, che offra le stesse funzionalità della

libreria all’Esercizio 2, ma realizzando tutte le funzioni in

maniera iterativa.

• Le funzioni iterative realizzate devono esibire la stesso

livello di efficienza di quelle ricorsive realizzate per

l’Esercizio 2.

• Al fine di realizzare alcune delle funzionalità richieste per la

libreria, sarà necessario modificare opportunamente gli

algoritmi di visita descritti nei lucidi presentati durante

questa lezione.