ALGORITMI E STRUTTURE DATI

Documenti analoghi
Alberi ed Alberi Binari

Alberi Binari di Ricerca

Espressioni aritmetiche

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.

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

Problemi di ordinamento

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

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

Algoritmi e Strutture Dati

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

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

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

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

Note per la Lezione 4 Ugo Vaccaro

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

Alberi binari e alberi binari di ricerca

Esercitazione 6. Alberi binari di ricerca

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

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

Alberi binari di ricerca

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

Esercizi su alberi binari

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.

Strutture dati dinamiche in C (II)

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

5. Quinta esercitazione autoguidata: liste semplici

Algoritmi e strutture dati

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

Alberi di ricerca binari

Alberto Montresor Università di Trento

Lezione 12 Tabelle Hash

Laboratorio di Algoritmi e Strutture Dati. Alberi Binari

Esempio: rappresentare gli insiemi

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

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

In questa lezione Alberi binari di ricerca: la cancellazione

Università degli Studi di L Aquila Facoltà di Scienze M.F.N. Corso di Laurea in Informatica. Modulo di Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati

Verificare se un albero binario è bilanciato

Algoritmi e Strutture Dati. Alberi

Implementazione dell albero binario in linguaggio C++

Alberi Binari di Ricerca

Laboratorio di Python

ricerca di un elemento, verifica dell appartenenza di un elemento

Rappresentazione di liste mediante puntatori in linguaggio C

Implementazione ADT: Alberi

Lezione 7 Alberi binari: visite e alberi di ricerca

Inserimento in una lista ordinata

Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Programmazione I - Laboratorio

ALGORITMI E STRUTTURE DATI

Per semplicità eliminiamo le ripetizioni nell'albero.

ALBERI DI RICERCA BINARI (O ALBERI BINARI DI RICERCA)

Algoritmi e Strutture Dati

lezione 9 min-heap binario Heap e Alberi posizionali generali

Prossime lezioni e tutorato!

Alberi binari di ricerca

Divide et impera su alberi

Laboratorio di Programmazione

Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato

Lezione 9 Alberi binari di ricerca

ADT ALBERO BINARIO (tree)) ADT ALBERO BINARIO

Esercitazione 11. Liste semplici

Esercitazioni di Algoritmi e Strutture Dati

Esercizi di Algoritmi e Strutture Dati

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

Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Alberi. Definizioni principali

Informatica 1. Prova di recupero 15 Febbraio 2005

Algoritmi e Strutture Dati

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

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009

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

Esercizi Capitolo 6 - Alberi binari di ricerca

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Indice come albero binario di ricerca!

Algoritmi e Strutture Dati. HeapSort

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

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Strutture dati per insiemi disgiunti

Allocazione dinamica memoria

Alberi binari. Esercizi su alberi binari

Lezione 9 Alberi binari: visite ed esercizi

Tipi di Dato V: Alberi Binari

Laboratorio di Python

alberi tipo astratto, implementazione, algoritmi

ALGORITMI E STRUTTURE DATI

Alberi rosso-neri. Oltre ad essere alberi binari di ricerca, gli alberi rosso-neri soddisfano le seguenti proprietà:

Dizionari. Dizionari con gli alberi. Alberi binari di ricerca. Realizzazione con alberi binari di ricerca. Alberi rosso-neri.

Esercizi su strutture dati

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

Indici multilivello dinamici (B-alberi e B + -alberi) Alberi di ricerca - 1. Un esempio. Alberi di ricerca - 3. Alberi di ricerca - 2

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.

Un esempio di mutua ricorsione

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

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

Informatica 1. Prova di recupero 21 Settembre 2001

Esercizi Strutture dati di tipo astratto

Heap e code di priorità

Transcript:

ALGORITMI E STRUTTURE DATI Esercitazioni AndreA Orlandini http://www.dia.uniroma3.it/~orlandin/asd/ e-mail: orlandin@dia.uniroma3.it Orario di ricevimento: Martedì 14.00-16.00 Puntatori e Alberi, ABR StudentiDIA Forum http://forum.studentidia.org/ Dove trovare i lucidi presentati a lezione http://limongelli.dia.uniroma3.it/asd/ Eserc-IV-1

Alberi Un albero è un insieme di oggetti, chiamati nodi, su cui è definita una relazione binaria G(x, y) che leggiamo x è genitore di y tale che: 1. esiste un unico nodo, chiamato radice, che non ha genitori; 2. ogni nodo x diverso dalla radice ha uno ed unico genitore; 3. per ogni nodo x diverso dalla radice esiste un cammino dalla radice a x (l albero è connesso): esistono nodi x 1,.., x k (k 1) tali che x 1 è la radice dell albero, x k = x e per ogni i = 1,..., k 1 x i è genitore di x i+1. 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. Eserc-IV-2

Terminologia di base cammino: sequenza di nodi x 1,..., x k, x k+1 tale che, per i = 1,..., k, x i è il genitore di x i+1 ; lunghezza del cammino: k (numero degli archi); antenato e discendente: dato un nodo x di un albero T con radice r, qualunque nodo y sul cammino (unico) da r a x è un antenato di x, mentre x è un discendente di y; fratelli: nodi che hanno lo stesso genitore; sottoalbero: insieme costituito da un nodo x e tutti i suoi discendenti; x è la radice del sottoalbero; foglia: nodo senza figli; nodo interno: nodo con uno o più figli; grado: il numero di figli di un nodo x è il grado di x; Profondità o Livello : La radice ha profondità 0 Se un nodo ha profondità k, i suoi figli hanno profondità k+1 Altezza dell albero : massima profondità a cui si trova una foglia ovvero numero di archi nel cammino dalla radice alla foglia più profonda Eserc-IV-3

Operazioni di base Empty(): restituisce una struttura rappresentante l albero vuoto Null(T): test albero vuoto. Root(T): restituisce il puntatore alla radice dell albero; un errore se T è vuoto. Left(T): restituisce il sottoalbero sinistro di T; un errore se T è vuoto. Right(T): restituisce il sottoalbero destro di T; un errore se T è vuoto. Left-Child(T): restituisce il puntatore al figlio sinistro; un errore se T è vuoto. Right-Child(T): restituisce il puntatore al figlio destro; un errore se T è vuoto. Mktree(x,T1,T2): restituisce l albero con radice x e sottoalberi T1 e T2. Eserc-IV-4

Rappresentazione di alcune operazioni di base EMPTY() NULL(T) 1. ;; eventuale allocazione 1. return (root[t] = NIL) ;; di memoria per T 2. root[t] <- NIL 3. return T ROOT(T) 1. if NULL(T) 2. then error "albero vuoto" 3. else return root[t] LEFT(T) 1. if NULL(T) then error "albero vuoto" 2. else ;; eventuale allocazione di memoria per T1 3. root[t1] <- left[root[t]] 4. return T1 RIGHT(T) 1. if NULL(T) then error "albero vuoto" 2. else ;; eventuale allocazione di memoria per T1 3. root[t1] <- right[root[t]] 4. return T1 Eserc-IV-5

Rappresentazione di alcune operazioni di base - continua LEFT-CHILD(T) 1. if NULL(T) 2. then error "albero vuoto" 3. else return left[root[t]] MK-TREE(x,T1,T2) 1. ;; eventuale allocazione di memoria per T 2. root[t] <- x 3. left[x] <- root[t1] 4. right[x] <- root[t2] 5. return T Operazioni sul tipo nodo NKEY(x) SET-KEY(x,k) 1. return key[x] 1. key[x] <- k NLEFT(x) SET-LEFT(x,y) 1. return left[x] 1. left[x] <- y NRIGHT(x) SET-RIGHT(x,y) 1. return right[x] 1. right[x] <-y Eserc-IV-6

Diversi modi per visitare gli alberi 16 14 8 2 4 7 1 5 10 9 3 preordine (profondità) visita il padre, visita il s.a. sinistro, visita il s.a. destro; 16,14,8,2,4,7,1,5,10,9,3 postordine (profondità) visita il s.a. sinistro, visita il s.a. destro, visita il padre; 2,4,8,1,5,7,14,9,3,10,16 simmetrica (profondità) visita il s.a. sinistro, visita il padre, visita il s.a. destro; 2,8,4,14,1,7,5,16,9,10,3 per livelli (ampiezza) 16,14,10,8,7,9,3,2,4,1,5 Eserc-IV-7

Visita in preordine Versione ricorsiva: PREORDER(T) 1. if not NULL(T) 2. then visita ROOT(T) 3. PREORDER(LEFT(T)) 4. PREORDER(RIGHT(T)) SE VOGLIAMO ASTRARRE DAL TIPO NODO oppure PREORDER (T ) T SI RIFERISCE AD UN TIPO PRECISO DI NODO 1. if T!= NIL 2. then visita T 3. PREORDER(left[T ]) 4. PREORDER(right[T ]) T <- ROOT(T) T PUNTATORE IN LINGUAGGIO C Eserc-IV-8

Visita in ampiezza Per memorizzare i puntatori ai figli (non vuoti) dei nodi che via via vengono visitati, si usa una coda. BREADTH-TREE(T) 1. EMPTY(Q) 2. if not NULL(T) 3. then ENQUEUE(Q,ROOT(T)) 4. while not EMPTY-QUEUE(Q) 5. do x <- DEQUEUE(Q) 6. visita x 7. if NLEFT(x)!= NIL 8. then ENQUEUE(Q,NLEFT(x)) 9 if NRIGHT(x)!= NIL 10. then ENQUEUE(Q,NRIGHT(x)) Eserc-IV-9

Esercizi Scrivere programmi che realizzino le operazioni seguenti sugli alberi binari: 1. NODE(x): riporta l albero costituito dall unico nodo x. 2. IS-NODE(T): predicato che determina se l albero è costituito da un unico nodo. 3. REMOVE-LEFT(T): riporta l albero che si ottiene da T eliminando il primo sottoalbero, se esiste; un errore altrimenti. 4. INSERT-LEFT(T,TLEFT): riporta l albero che si ottiene aggiungendo a T l albero TLEFT come sottoalbero sinistro. Il programma riporta un errore se T è vuoto o se ha già il sottoalbero sinistro. 5. SEARCH(T,k): riporta il puntatore a un nodo di T con chiave k, se esiste, NIL altrimenti. 6. DELETE-SUBTREE(T,x): elimina da T il sottoalbero con radice x, se esiste. Altrimenti T rimane inalterato. 7. POSTORDER(T): visita in post-ordine dell albero con radice T. 8. SIMM(T): visita simmetrica dell albero con radice T. 9. Specializzare le visite dell albero in modo tale che ogni nodo visitato venga memorizzato in una lista. Utilizzare le funzioni definite sulle liste. 10. H(T): riporta l altezza dell albero con radice T. Si ricordi che un albero costituito da un solo nodo ha altezza 0. Eserc-IV-10

Rappresentazioni Utilizziamo una rappresentazione GRAFICA per gli alberi 1 2 4 5 3 6 7 Esiste anche una notazione testuale detta PARENTETICA ( 1 ( 2 ( 4 () () ) ( 5 () () ) ) ( 3 ( 6 () () ) ( 7 () () ) ) ) Un nodo n che non ha figli è rappresentato da ( n () () ) Eserc-IV-11

Rappresentazione di Alberi Binari in C mediante puntatori Utilizziamo la solita tecnica di rappresentazione typedef... TipoInfoAlbero; struct StructAlbero TipoInfoAlbero info; struct StructAlbero *destro, *sinistro; ; typedef struct StructAlbero TipoNodoAlbero; typedef TipoNodoAlbero *TipoAlbero; Un puntatore nullo rappresenta un albero vuoto, mentre un puntatore ad un nodo rappresenta un albero che ha come radice l elemento puntato Vediamo come creare un albero a partire da una sua rappresentazione parentetica Eserc-IV-12

Creazione di Alberi letti da file Creazione di un albero binario a partire dalla rappresentazione parentetica letta da file TipoAlbero LeggiAlbero(char *nome_file) TipoAlbero result; FILE *file_albero; file_albero = fopen(nome_file, "r"); assert(file_albero); result = LeggiSottoAlbero(file_albero); fclose(file_albero); return result; Leggo sul file la struttura dell albero tramite la funzione LeggiSottoAlbero char LeggiParentesi(FILE *f) /* funz. per leggere gli spazi tra le () */ char c = fgetc(f); while (c!= ( && c!= ) ) c = fgetc(f); return c; Eserc-IV-13

Questa funzione esegue la costruzione vera e propria TipoAlbero LeggiSottoAlbero(FILE *file_albero) char c; TipoInfoAlbero i; TipoAlbero r; c = LeggiParentesi(file_albero); c = fgetc(file_albero); if (c == ) ) return NULL; else fscanf(file_albero, "%d", &i); r = (TipoAlbero) malloc(sizeof(tiponodoalbero)); r->info = i; r->sinistro = LeggiSottoAlbero(file_albero); r->destro = LeggiSottoAlbero(file_albero); c = LeggiParentesi(file_albero); return r; Eserc-IV-14

Stampa in forma parentetica non indentata void StampaAlbero(TipoAlbero albero) if (albero == NULL) printf("()"); return; printf("( %d ", albero->info); StampaAlbero(albero->sinistro); StampaAlbero(albero->destro); printf(" )"); Esempio di main main() char nomefile[80]; TipoAlbero tree; strcpy(nomefile,"alb.par"); tree = LeggiAlbero(nomefile); StampaAlbero(tree); printf("\n"); Eserc-IV-15

il file di input ALB.PAR ( 1 ( 2 ( 4 () () ) ( 5 () () ) ) ( 3 ( 6 () () ) ( 7 () () ) ) ) Il risultato della funzione ( 1 ( 2 ( 4 ()() )( 5 ()() ) ) ( 3 ( 6 ()() )( 7 ()() ) ) ) Riproduco la rappresentazione parentetica La stampa può risultare poco chiara Eserc-IV-16

Stampa in forma parentetica indentata void StampaLivello(TipoAlbero albero, int livello) if (albero == NULL) Indenta(livello); /* 2 blank x livello */ printf("()\n"); return; Indenta(livello); printf("( "); printf("%d\n", albero->info); StampaLivello(albero->sinistro, livello + 1); StampaLivello(albero->destro, livello + 1); Indenta(livello); printf(")\n"); void StampaAlberoIndentato(TipoAlbero albero) putchar( \n ); StampaLivello(albero, 0); Eserc-IV-17

Nella funzione main cambio solo la funzione di stampa main() char nomefile[80]; TipoAlbero tree; strcpy(nomefile,"alb.par"); tree = LeggiAlberoIndentato(nomefile); StampaAlbero(tree); printf("\n"); il file di input è lo stesso e ottengo come risultato di esecuzione ( 1 ( 2 ( 4 () () ) ( 5 () ().. Eserc-IV-18

Calcolare la profondità di un albero int Massimo(int a, int b); int Profondita(TipoAlbero albero) int s, d; Alcune funzioni sugli alberi if (albero == NULL) return -1; else s = Profondita(albero->sinistro); d = Profondita(albero->destro); return (Massimo(s, d) + 1); Eserc-IV-19

Test di presenza di un nodo bool Presente(TipoAlbero albero, int elem) if (albero == NULL) return FALSE; else if (albero->info == elem) return TRUE; else return (Presente(albero->sinistro, elem) Presente(albero->destro, elem)); Stampa Foglie void StampaFoglie(TipoAlbero albero) if (albero!= NULL) if (isfoglia(albero)) stampanodo(albero->info); StampaFoglie(albero->sinistro); StampaFoglie(albero->destro); bool isfoglia(tipoalbero) return ((albero->sinistro == NULL) && (albero->destro == NULL)) Eserc-IV-20

Test della proprietà di albero crescente. Un albero è crescente se: a) è vuoto b) esiste un cammino radice-foglia con valori sempre crescenti bool Crescente(TipoAlbero albero) if (albero == NULL) return TRUE; if (albero->sinistro == NULL && albero->destro == NULL) return TRUE; if (albero->sinistro!= NULL) if ((albero->info < albero->sinistro->info) && Crescente(albero->sinistro)) return TRUE; if (albero->destro!= NULL) if ((albero->info < albero->destro->info) && Crescente(albero->destro)) return TRUE; return FALSE; Eserc-IV-21

Es. ( 10 ( 14 ( 23 () () ) ( 28 ( 34 () () ) ( 1 () () ) ) ) ( 67 ( 11 () () ) ( 53 () () ) ) ) 10 14 23 28 34 1 67 11 53 E crescente questo albero? Per esercizio modificate la funzione Presente, ipotizzando di lavorare con alberi crescenti Eserc-IV-22

Algoritmi di visita 1 2 4 5 3 6 7 Visita in preordine Si analizza la radice, poi si visita sottoalbero sinistro e sottoalbero destro Es. 1, 2, 4, 5, 3, 6, 7 Visita in postordine Si visita prima sottoalbero sinistro, poi destro, e alla fine la radice Es. 4, 5, 2, 6, 7, 3, 1 Visita Simmetrica Prima visito il figlio sinistro, poi la radice e quindi il figlio destro. Es. 4, 2, 5, 1, 6, 3, 7 Visita per livelli Il primo nodo a essere analizzato è la radice. Poi si analizzano i figli della radice. E poi i figli dei figli... Es. 1, 2, 3, 4, 5, 6, 7 Per tutte le visite: nel caso in cui l abero sia vuoto non viene eseguita nessuna azione Eserc-IV-23

Visita in preordine void Analizza(int n) printf("%d ", n); void VisitaPreordine(TipoAlbero a) if (a == NULL) return; Analizza(a->info); VisitaPreordine(a->sinistro); VisitaPreordine(a->destro); Come viene visitato l albero? 10 14 23 28 34 1 67 11 53 Eserc-IV-24

Visita in postordine void Analizza(int n) printf("%d ", n); void VisitaPostordine(TipoAlbero a) if (a == NULL) return; VisitaPostordine(a->sinistro); VisitaPostordine(a->destro); Analizza(a->info); Come viene visitato l albero? 10 14 23 28 34 1 67 11 53 Eserc-IV-25

Visita Simmetrica void Analizza(int n) printf("%d ", n); void VisitaSimmetrica(TipoAlbero a) if (a == NULL) return; VisitaSimmetrica(a->sinistro); Analizza(a->info); VisitaSimmetrica(a->destro); Come viene visitato l albero? 10 14 23 28 34 1 67 11 53 Eserc-IV-26

Visita per livelli Utilizziamo la struttura dati Coda (codapunt.c) void VisitaLivelli(TipoAlbero albero) TipoCoda coda; TipoAlbero a; InitCoda(&coda); InCoda(&coda, albero); while (! TestCodaVuota(coda)) OutCoda(&coda, &a); if (a!= NULL) Analizza(a->info); InCoda(&coda, a->sinistro); InCoda(&coda, a->destro); printf("\n"); Eserc-IV-27

La coda è utilizzata per memorizzare i nodi in ordine di livello Esempio 10 14 23 28 34 1 67 11 53 Come viene visitato l albero? Eserc-IV-28

Esercizio Lista-ABR (Appello Luglio 2003) Dato un Albero Binario di Ricerca A etichettato con interi e data una lista L i cui nodi contengono valori interi non ripetuti e ordinati in ordine crescente, creare una nuova lista D i cui elementi sono tutti gli elementi dell albero che non sono presenti nella lista L. Soluzione Facile Dobbiamo visitare l albero e chiederci per ogni elemento se questo appartiene o no alla lista L. Se non appartiene lo inseriamo in D, altrimenti continuiamo la visita. Inserisci Codice di Visita (qualsiasi) e Analizza con controllo! come posso migliorare questo algoritmo? Sfrutto l ordinamento di L Sfrutto l ordinamento di A Cerchiamo di ragioniare sulla struttura dati Quale è la caratteristica dell ABR? La lista L è ordinata. Quale visita per l albero mi conviene utilizzare per sfruttare le proprietà delle strutture di input del problema? (Preordine, Postordine, Simmetrica, Per livelli) Eserc-IV-29

Visita Simmetrica Eseguiamo le visite di entrambe le strutture dati contemporaneamente Ogni volta che trovo un elemento di A che non appartiene a L lo inserisco in D La funzione ANALIZZA quindi è definita come segue: VISITA(A,L,D) IF A <> NIL THEN VISITA(SX[A],L,D) ANALIZZA(KEY[A],L,D) VISITA(DX[A],L,D) Concentriamoci sulla funzione ANALIZZA Scorro la lista L fino a quando finisce o INFO[L] KEY[A] Se INFO[L] = NULL > inserisco KEY[A] in D Se INFO[L] KEY[A] > inserisco KEY[A] in D Quindi continuo la visita di A 8 4 2 6 12 10 24 1, 3, 6, 10, 20 > 2, 4, 12, 24 Eserc-IV-30

ANALIZZA(K,L,D) WHILE ((L<>NIL) AND (INFO[L] < K)) L <- NEXT[L] Pseudo-Codice di ANALIZZA IF ((L = NIL) OR (INFO[L] <> K)) THEN INSERISCITESTALISTA(D,K) Codifica in C L e D sono passate per riferimento void analizza(tipoinfoalbero k, TipoLista *L, TipoLista *D) while ((*L!= NULL) && ((*L)->infoL < k)) *L = (*L)->next; if ((*L == NULL) ((*L)->infoL!= k)) InserisciTestaLista(D,k); Eserc-IV-31

Visita Simmetrica void visita(tipoalbero A,TipoLista *L, TipoLista *D) if (A!=NULL) visita(a->sinistro,l,d); analizza(a->infoa,l,d); visita(a->destro,l,d); Per esercizio: Dato un albero A (rappresentato mediante puntatori) le cui etichette sono valori interi, costruire una lista L, contenente un nodo per ogni cammino in A, il cui valore è pari alla somma delle etichette del cammino. Ancora per esercizio: Definire un tipo in C per un albero n-ario. Eserc-IV-32