Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Documenti analoghi
Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Alberi Binari di Ricerca

Alberi ed Alberi Binari

Divide et impera su alberi

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Alberi binari di ricerca

Alberi binari ( 7.3)

Alberi ( GT. 7 ) In informatica, un albero è un modello astratto con cui viene rappresentata una struttura gerarchica

Esercitazione 6. Alberi binari di ricerca

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Algoritmi e Strutture Dati

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Alberi di ricerca binari

Alberi binari di ricerca

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

Esercizi Capitolo 6 - Alberi binari di ricerca

Alberi binari (radicati e ordinati) della radice Il padre del nodo 5 e del nodo 3

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

La struttura dati ad albero binario

Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

ALBERI DI RICERCA BINARI (O ALBERI BINARI DI RICERCA)

Implementazione ADT: Alberi

Lezione 12 Tabelle Hash

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

ALGORITMI E STRUTTURE DATI

Algoritmi e Strutture Dati. HeapSort

Alberi binari di ricerca

alberi tipo astratto, implementazione, algoritmi

Introduzione agli algoritmi Prova di esame del 30/6/2016 Prof.sse E. Fachini - R. Petreschi

In questa lezione Alberi binari di ricerca: la cancellazione

Alberi binari e alberi binari di ricerca

Alberi. La definizione ricorsiva: Un albero radicato (non vuoto) è: o un singolo nodo o una radice connessa a un insieme di alberi.

Algoritmi e Strutture Dati. Alberi

ADT Dizionario. Ordered search table. Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

Alberto Montresor Università di Trento

Esercizi su alberi binari

Algoritmi e Strutture Dati

Lezione 15. Algoritmi su gli alberi binari: visite

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Quando A e B coincidono una coppia ordinata é determinata anche dalla loro posizione.

Lezione 7 Alberi binari: visite e alberi di ricerca

Alberi Binari di Ricerca e Alberi Rosso-Neri

Lezione 9 Alberi binari di ricerca

Esercizi Capitolo 5 - Alberi

Indice come albero binario di ricerca!

Per semplicità eliminiamo le ripetizioni nell'albero.

Spiegazioni ASD 2012 Luddisti Spaziali

Esercizi Capitolo 6 - Alberi binari di ricerca

Laboratorio di Algoritmi e Strutture Dati

Esercizi di Algoritmi e Strutture Dati

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Algoritmi e strutture dati

Alberi e alberi binari I Un albero è un caso particolare di grafo

Esercizi su BST. IASD a.a A. De Bonis

Algoritmi e Strutture Dati

Implementazione dell albero binario in linguaggio C++

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Alberi binari. Esercizi su alberi binari

Alberi auto-aggiustanti

ricerca di un elemento, verifica dell appartenenza di un elemento

Dati e Algoritmi 1: A. Pietracaprina. Alberi

Prossime lezioni e tutorato!

Alberi Binari di Ricerca

Indici con gli alberi

Problemi di ordinamento

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

PROGRAMMI LINGUAGGIO C

Dati e Algoritmi 1: A. Pietracaprina. Alberi Generali

I tipi di dato astratti

Note per la Lezione 4 Ugo Vaccaro

Strutture dati dinamiche in C (II)

Binary Search Trees (BST) Algoritmi sui BST. Algoritmi - Ricerca. Fondamenti di Informatica T2 Modulo 2. Università di Bologna A.A.

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Attraversamento di un albero (binario)

Alberi binari. Un albero binario è un albero con radice in cui ogni nodo ha al massimo due figli, chiamati figlio sinistro e figlio destro.

Un esempio di mutua ricorsione

Lezione 9 Alberi binari: visite ed esercizi

Strutture dati non lineari. Esercitazione 3. Rappresentazione della Conoscenza Daniele Nardi, 2008Esercitazione 3 0

Fondamenti di Informatica II. Alberi

Esercitazioni di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

ADT ALBERO BINARIO (tree)) ADT ALBERO BINARIO

Introduzione. Heap-binomiali: un heap binomiale è un insieme di alberi binomiali.

Lezione 9 Alberi binari di ricerca

Algoritmi e Strutture Dati

Pile: implementazioni. Pile. Pile: liste /1. Pile: liste /2. Università Roma La Sapienza Corsi di Laurea Informatica/Tecnologie Informatiche

Alberi Binario in Java

4.1 Modelli di calcolo analisi asintotica e ricorrenze

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Espressioni aritmetiche

B-Tree. Struttura dati usata in applicazioni che necessitano di gestire insiemi di chiavi ordinate Una variante (B+-Tree) è diffusa in:

Transcript:

Visite di alberi binari Laboratorio di Algoritmi e Strutture Dati

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.

Visita di Alberi Binari: in profondità preordine Visita-Preordine(T) IF T NIL THEN vista T Visita-Preordine(T->sx) Visita-Preordine(T->dx) sx node key dx T a b e c d f g Sequenza: a b c d e f g

Visita di Alberi Binari: in profondità preordine Visita-Preordine(node *T) { IF (T) { Vista(T); Visita-Preordine(T->sx); Visita-Preordine(T->dx); T b a e c d f g sx node key dx Sequenza: a b c d e f g

Visita di Alberi Binari: in profondità inordine Visita-Inordine(T) IF T NIL THEN Visita-Inordine(T->sx) vista T Visita-Inordine(T->dx) T a b e c d f g Sequenza: c b d a f e g

Visita di Alberi Binari: in profondità postordine Visita-Postordine(T) IF T NIL THEN Visita-Postordine(T->sx) Visita-Postordine(T->dx) vista T T a b e c d f g Sequenza: c d b f g e a

Visita Preorder Iterativa Visita-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) next = curr->sx ELSE /* Discesa dx */ curr = top(stack) pop(stack) next = curr->dx curr = next

Visita-preorder-iter(node * T) { stack *st = NULL; node *curr = T, next; while(st curr) { if(curr) { /* Visita e discesa a sx */ Visita(curr); st = push(st,curr); next = curr->sx else { /* Discesa a dx */ curr = top(st); st = pop(st); next = curr->dx; curr = next;

Visita-preorder-iter2(node * T) { stack *st = NULL; node *curr = T, next; while(curr) { Visita(curr); if(curr->dx) /* Salva per discesa a dx */ st = push(st,curr->dx); if (curr->sx) /* Discesa a sx */ next = curr->sx else { /* Discesa a dx */ if (st) { next = top(st); st = pop(st); else next = NULL; curr = next

Visita Inorder Iterativa Visita-inorder-iter(T) stack = NIL curr = T WHILE (stack NIL OR curr NIL) DO IF (curr NULL) THEN /* Discesa sx */ push(stack,curr) next = curr->sx ELSE /* Discesa dx */ curr = top(stack) pop(stack) vista curr next = curr->dx curr = next

Visita-inorder-iter(node * T) { stack *st = NULL; node *curr = T, next; while(st curr) { if(curr) { /* Discesa a sx */ st = push(st,curr); next = curr->sx else { /* Visita e discesa a dx */ curr = top(st); st = pop(st); Visita(curr); next = curr->dx; curr = next

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;

Visita Postorder Iterativa Visita-postorder-iter(T) stack = NIL curr = T, last = NIL, next=nil WHILE (stack NIL OR curr NIL) DO IF (curr NIL) THEN /* Discesa sx */ push(stack,curr) next = curr->sx ELSE curr = top(stack) /* Risalita */ IF (curr->dx = NIL OR last = curr->dx) THEN vista curr pop(stack) next = NIL ELSE next = curr->dx /* Discesa dx */ last = curr curr = next

Visita-postorder-iter(node * T) { stack *st = NULL; node *last, curr = T, next; while(st curr) { if(curr) { /* Discesa a sx */ st = push(st,curr); next = curr->sx else { /* Visita o discesa a dx */ curr = top(st); if (!curr->dx last == curr->dx){ Visita(curr); st = pop(st); next = NULL; else curr = curr->dx; /* Discesa a dx */ last = curr; curr = next;

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;

DUPLICA (T) nodo *n = NIL IF (T!= NIL) THEN n = alloca_nodo(t->key) n->sx = DUPLICA(T->sx) n->dx = DUPLICA(T->dx) return n;

DUPLICA_ITER(T) c = T WHILE (st1!= NIL OR c!= NIL) DO IF (c!= NIL) THEN // fase di discesa n = alloca_nodo(c->key) // crea nodo per la copia st1 = push(st1,c); st2 = push(st2,n) // memorizza c e n in stack nxt = c->sx ; ret = NIL; // scende a sinistra nell originale ELSE // fase di risalita da dx o da sx nell originale c = top(st1); n = top(st2) // recupera c e n da stack IF (c->dx = NIL lst = c->dx) THEN // se risale da destra IF (c->dx = NIL) THEN n->sx = ret // attacca ret come figlio sinistro di n ELSE n->dx = ret // attacca ret come figlio destro di n st1 = pop(st1); st2 = pop(st2) ret = n; nxt = NIL // risale tenendo traccia del last per la copia ELSE // se risale da sx n->sx = ret // attacca ret come figlio sinistro di n nx = c->dx // scende a destra se necessario ret = NIL // ret viene resettato a NIL lst = c; c = nxt // effettua l aggiornamento di curr e last per l originale return n