Laboratorio di Informatica Lezione 8: Gli algoritmi per gli alberi In questa lezione vedremo: ÎUn cenno agli alberi binari ÎGli algoritmi fondamentali per gli alberi ÎUn programma esemplificativo Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 2 La struttura di un albero generico Info P P P P P P Info Info P P P P Info Info P P P Lezione 8: Gli algoritmi per gli alberi P P P P P P P P P P P P Non esistono percorsi chiusi 2/14/03 09:15 3 La struttura di un albero binario Info P Sottoalbero Info P Ø Lezione 8: Gli algoritmi per gli alberi P Info Info P Nodo radice Ø P Info Ø P Nodo figlio del nodo radice Info Ø Ø Foglia 2/14/03 09:15 4 Alberi binari ÎEsiste un solo genitore per ogni nodo tranne che per il nodo radice; ÎDue puntatori diversi si riferiscono a due nodi diversi: se così non fosse, si tratterebbe di un grafo; ÎNegli alberi binari possono esistere per ogni nodo 0, 1 o 2 figli; ÎSi definisce altezza di un albero il livello del nodo più profondo; ÎLa struttura dell’albero è intrinsecamente ricorsiva: ogni sottoalbero è a sua volta un albero. Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 5 Inserzione 1 Tigre Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 6 Inserzione 1 Tigre Cane Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 7 Inserzione 1 Tigre Cane Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 8 Inserzione 2 Tigre Cane Rana Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 9 Inserzione 2 Tigre Cane Rana Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 10 Inserzione 3 Tigre Cane Bue Lezione 8: Gli algoritmi per gli alberi Rana 2/14/03 09:15 11 Inserzione 3 Tigre Cane Bue Lezione 8: Gli algoritmi per gli alberi Rana 2/14/03 09:15 12 Inserzione 4 Tigre Cane Bue Rana Leone Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 13 Inserzione 4 Tigre Cane Bue Rana Leone Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 14 In altre parole: ÎSe l’albero è vuoto: l inseriamo il nuovo elemento; Îaltrimenti: l se la chiave è inferiore al nodo: • applicare l’algoritmo nel sottoalbero sinistro; l se la chiave è superiore al nodo: • applicare l’algoritmo nel sottoalbero destro; l altrimenti: • L’elemento esiste già. Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 15 Attenzione alle inserzioni! Gatto Gatto Cane Elefante Cane Tigre Civetta Tigre Leone Elefante Leone Topo Topo Giraffa Lezione 8: Gli algoritmi per gli alberi Civetta Giraffa 2/14/03 09:15 16 Attenzione alle inserzioni! Cane Cane Leone Civetta Elefante Civetta Gatto Giraffa Tigre Elefante Leone Tigre Topo Topo Gatto Giraffa Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 17 La visita Îse l’albero è vuoto: l non fare nulla; Î!a! ltrimenti: l l l - estrarre il sottoalbero di sinistra; - estrarre il nodo radice; - estrarre il sottoalbero di destra. Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 18 La ricerca Îse l’albero è vuoto: l chiave non trovata; Îaltrimenti: l se la chiave è inferiore al nodo: • applicare l’algoritmo nel sottoalbero sinistro; l se la chiave è superiore al nodo: • applicare l’algoritmo nel sottoalbero destro; l altrimenti: • chiave trovata: è nel nodo in esame. Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 19 Per esemplificare: typedef struct node //Questa è la definizione //del nodo dell'albero { nonsocosa Info; //Contenuto informativo struct node *psnLeft, *psnRight; // puntatori //ai prox. nodi } NODOALB, *PTRNODOALB; Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 20 Creiamo un nuovo nodo (1): PTRNODOALB addnode (PTRNODOALB psn) { if (psn == NULL) { } Lezione 8: Gli algoritmi per gli alberi // L'albero e' vuoto o siamo // arrivati in fondo a un ramo psn = (PTRNODOALB) malloc(sizeof(NODOALB)); psn->Info = …; psn->psnLeft = psn->psnRight = NULL; 2/14/03 09:15 21 Creiamo un nuovo nodo (2): else { if (chiave < psn->Info) psn->psnLeft = addnode(psn->psnLeft); // Scendiamo verso sinistra else if (chiave > psn->Info) psn->psnRight = addnode(psn->psnRight); // Scendiamo verso destra else fai qualcosa di sensato // Trovato! } return psn; } Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 22 E adesso vediamo un esempio pratico: ÎIl programma opera su un albero i cui nodi contengono: l l Una parola, usata come chiave per l’ordinamento (Word) Un numero intero (Count). ÎIl programma legge da un file una serie di parole. Per ogni parola: l l l Vengono applicate alcune regole di filtraggio (minuscole -> maiuscole, etc.) Se l’albero non la contiene ancora viene creato un nuovo nodo Se l’albero la contiene già viene incrementato Count. ÎIl programma stampa l’elenco (in ordine alfabetico) di tutte le parole lette e il numero di occorrenze di ogni parola. Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 23 Inoltre… ÎE’ possibile immettere parole da tastiera, e sapere quante occorrenze ci sono per ogni parola. Lezione 8: Gli algoritmi per gli alberi 2/14/03 09:15 24