ALBERI Angelo Di Iorio Università di Bologna
Esercizio 1 Implementare una classe Java per memorizzare e leggere informazioni relative a una dinastia Esempio nella prossima slide Per ogni persona: Nome Anni di vita
Dinastia dei Medici Immagine completa: https://www.firenze-online.com/img/artisti/foto-famigliademedici3.jpg
Esercizio 1 La classe FamilyTree rappresenta un nodo (sottoalbero) ed espone i metodi per: inizializzare il nodo (radice) con nome e anni accedere alle informazioni relative al nodo (nome, anni, figli, padre) aggiungere un nodo come ultimo figlio di questo nodo aggiungere un insieme di figli (passati con un vettore) Realizzazione basata su lista dei figli Istanziare gli oggetti per descrivere la dinastia de I Medici: Test: http://diiorio.nws.cs.unibo.it/asd1819/java/
Interfaccia import java.util.arraylist; public interface IFamilyTree { Commenti? public void aggiungifiglio(familytree f); public String getnome(); public Integer getanni(); public FamilyTree getpadre(); public void setpadre(familytree p); public ArrayList<FamilyTree> getfigli();
Campi e costruttore import java.util.arraylist; public class FamilyTree { private String nome; private Integer anni; private FamilyTree padre; private ArrayList<FamilyTree> figli; Overloading? public FamilyTree(String nome, Integer anni) { this.nome = nome; this.anni = anni; this.padre = null; this.figli = new ArrayList<FamilyTree>();
Esercizio 2 Implementare una classe FamilyTreeVisits per visitare l albero. Implementare un metodo printtree(familytree t) che stampa su terminale i dati memorizzati nell albero t con una semplice visualizzazione indentata Una riga per persona, che mostra nome ed età Dati dei figli indentati di un tab [vedi esempio in prossima slide]
Esercizio 2
printfamilytree private void printtreewithtabs(familytree t, Integer level){ if (t!= null) { printtabs(level); System.out.println(t.getNome() + " (" + t.getanni() +")"); for (FamilyTree f : t.getfigli()) { printtreewithtabs(f, level + 1);
Esercizio 3 Aggiungere alla classe FamilyTreeVisits un metodo (ricorsivo) per cercare un discendente per nome FamilyTree cercadiscendentepernome(familytree tree, String nome); Il metodo ritorna il primo discendente in profondità il cui nome contiene la stringa passata come parametro Domande: Quanti figli ha avuto Lorenzo il Magnifico? Quanti anni ha vissuto Piero il Gottoso? Cosimo il Vecchio ha avuto un discendente chiamato Guido?
public FamilyTree cercadiscendentepernome(familytree tree, String nome){ FamilyTree descendantfound = null; if (tree!= null) { I t e r a t o r < FamilyTree> ti = tree.getfigli().iterator(); while (ti.hasnext() && descendantfound==null) { FamilyTree current = (FamilyTree) ti.next(); if (current.getnome().contains(nome)) descendantfound = current; else descendantfound = this.cercadiscendentepernome(current, nome); return descendantfound;
Esercizio 4 Aggiungere un metodo per cercare il primo discendente che ha vissuto almeno X anni public FamilyTree cercaprimodiscendenteetaminima(familytree tree, Integer anni); Analizzare nell ordine: tutti i figli, poi tutti i nipoti, poi tutti i pronipoti, etc.
public FamilyTree cercaprimodiscendenteetaminima(familytree tree, Integer anni){ FamilyTree descendantfound = null; ArrayDeque<FamilyTree> coda = new ArrayDeque<FamilyTree>(); coda.push(tree); while (!coda.isempty() && descendantfound==null) { FamilyTree current = coda.pop(); if (current.getanni() < anni) descendantfound = current; else { for (FamilyTree f : current.getfigli()) {coda.push(f); return descendantfound;
Esercizio 5 Dato un albero ordinato i cui nodi contengono valori interi, si vogliono contare tutti i nodi (anche quelli intermedi) tali per cui il percorso radice-nodo ha somma complessiva dei valori uguale a k. 3 2 1 1 3 4 2 8 5-1 5 2 6 1 1-4 5 1 0 5 6 1 2 5
Esercizio 5 Implementare in Java: una classe TreeInt che rappresenta l albero; per semplicità ogni nodo ha il valore intero e la lista di figli e implementa costruttore e metodo per aggiungere un figlio una classe TreeIntVisit che implementa un metodo per contare i nodi: public Integer nodessumk(treeint t, Integer k, Integer somma);
nodessumk private int nodessumk(treeinteger t, Integer k, Integer s) { int cl = 0; if (s + t.getvalue() == k) cl = 1; for (TreeInteger child : t.children) { cl += this.nodessumk(child, k, s+t.getvalue()); return cl;