La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Alberi tipo astratto, implementazione, algoritmi.

Presentazioni simili


Presentazione sul tema: "Alberi tipo astratto, implementazione, algoritmi."— Transcript della presentazione:

1 alberi tipo astratto, implementazione, algoritmi

2 ASD - Alberi2 argomenti tipo astratto albero definizione implementazione in Java algoritmi di visita alberi binari implementazione di alberi binari in Java

3 ASD - Alberi3 tipo di dato astratto albero insieme vuoto di nodi oppure costituito da una radice R e da 0 o più alberi (sottoalberi) la radice di ogni sottoalbero è collegata a R da un arco T1T1 T2T2 TnTn R es.: radice R con n sottoalberi

4 ASD - Alberi4 terminologia genitore, figlio, fratello concetti intuitivi nodo foglia se ha zero figli interno se ha almeno un figlio radice foglia nodo interno

5 ASD - Alberi5 terminologia/2 livello di un nodo lunghezza (n.ro nodi) percorso radice-nodo ramo percorso radice-foglia altezza albero lunghezza (n.ro nodi) ramo più lungo altezza = 3 livello radice = 1

6 ASD - Alberi6 alberi?

7 ASD - Alberi7 esempi di alberi alberi genealogici gerarchie di ereditarietà ad es., in Java classificazioni di specie animali organizzazione del territorio continente, nazione, regione, provincia ecc (alcuni) organigrammi file system domini Internet

8 ASD - Alberi8 rappresentazione di alberi con liste collegate R A B C Elemento Riferimento al primo figlio Riferimento al prossimo fratello Primo figlio di R Fratello di A livello di C = 3

9 ASD - Alberi9 operazioni sugli alberi operazioni più importanti element(v): restituisce lelemento memorizzato nel nodo v root(): restituisce la radice dellalbero parent(v): restituisce il genitore del nodo v children(v): restituisce i figli di v isLeaf(v): restituisce true se v è una foglia isRoot(v): restituisce true se v è la radice

10 ASD - Alberi10 operazioni sugli alberi Altre operazioni livello di un nodo altezza dellalbero # nodi # foglie arità max # di figli di un nodo dellalbero isEmpty true se lalbero ha zero nodi

11 ASD - Alberi11 rappresentazione dei nodi in Java nodi class TreeNode { Object element; TreeNode firstChild; TreeNode nextSibling; TreeNode parent; }

12 ASD - Alberi12 tipo astratto albero in Java public interface Tree { Object element(TreeNode v); TreeNode root(); TreeNode parent(TreeNode v); ListIteratorListIterator children(TreeNode v); boolean isLeaf(TreeNode v); boolean isRoot(TreeNode v); }

13 ASD - Alberi13 algoritmi su alberi livello di un nodo public int level(TreeNode v) { if(this.isRoot(v)) return 1; else return 1 + level(this.parent(v)); } costo proporzionale allaltezza: O(h )

14 ASD - Alberi14 algoritmi su alberi/2 altezza di un (sotto)albero costo proporzionale al numero di nodi: (n ) viene esaminato ogni nodo ciascun nodo viene esaminato una sola volta int height(v) { int h=0, hmax=0; if(v == null) return 0; if(isLeaf(v)) return 1; TreeNode w = v.firstChild; hmax = height(w); while(w.nextSibling != null) { w = w.nextSibling; h = height(w); if(h > hmax) hmax = h; } return 1 + hmax; }

15 ASD - Alberi15 algoritmi su alberi/3 visita (o attraversamento) di un albero in profondità (depth-first search, a scandaglio): DFS vengono visitati i rami, uno dopo laltro tre varianti in ampiezza (breadth-first search, a ventaglio): BFS a livelli, partendo dalla radice

16 ASD - Alberi16 visite in profondità/preordine in preordine (preorder, o ordine anticipato) dato un nodo v visita v visita i sotto-alberi aventi come radice i figli di v, da sinistra verso destra void treePreorder(root) { if(root == null) return; r = root.firstChild while (r != null) { treePreorder(r); r = r.nextSibling; }

17 ASD - Alberi17 visite in profondità/inordine in ordine simmetrico (inorder) dato un nodo v con k sotto-alberi visita il primo sotto-albero (radice v.firstChild) visita v visita gli altri k-1 sotto-alberi void treeInorder(root) { if(root == null) return; r = root.firstChild; treeInorder(r); r = r.nextSibling; while (r != null) { treeInorder(r); r = r.nextSibling; }

18 ASD - Alberi18 visite in profondità/postordine in postordine (postorder, o ordine posticipato) dato un nodo v visita i sotto-alberi aventi come radice i figli di v, da sinistra verso destra visita v void treePostorder(root) { if(root == null) return; r = root.firstChild while (r != null) { treePostorder(r); r = r.nextSibling; } }

19 ASD - Alberi19 visite in profondità preordineinordinepostordine

20 ASD - Alberi20 visita in ampiezza breadth-first search (BFS), usa una coda dato un nodo v void bfs(v) { if(v == null) return; queue.enqueue(v); while (!queue.isEmpty()) { v = queue.dequeue(); v.visit(); TreeNode w = v.firstChild; while(w != null) { queue.enqueue(w); w = w.nextSibling; }

21 ASD - Alberi21 visita in ampiezza BFS

22 ASD - Alberi22 alberi binari un albero si dice binario se ogni nodo può avere al più 2 figli la rappresentazione si semplifica public class BinaryNode { protected Object element; protected BinaryNode leftChild; protected BinaryNode rightChild; } implementazione minima

23 ASD - Alberi23 ADT albero binario in Java public interface BinaryTree { Object element(BinaryNode v); BinaryNode root(); BinaryNode parent(BinaryNode v); BinaryNode leftChild(BinaryNode v); BinaryNode rightChild(BinaryNode v); boolean isLeaf(BinaryNode v); boolean isRoot(BinaryNode v); }

24 ASD - Alberi24 alberi binari/visita in preordine void treePreorder(BinaryNode v) { if(v == null) return; treePreorder(leftChild(v)); treePreorder(rightChild(v)); }

25 ASD - Alberi25 alberi binari/visita inordine void treeInorder(BinaryNode v) { if(v == null) return; treeInorder(leftChild(v)); treeInorder(rightChild(v)); }

26 ASD - Alberi26 alberi binari/visita in postordine void treePostorder(BinaryNode v) { if(v == null) return; treePostorder(leftChild(v)); treePostorder(rightChild(v)); }

27 ASD - Alberi27 alberi binari/visita in ampiezza void bfs(v) { TreeNode p = v; queue.enqueue(p); while (!queue.isEmpty()) { p = (BSTNode) queue.dequeue(); p.visit(); if (p.leftChild != null) queue.enqueue(p.leftChild); if (p.rightChild != null) queue.enqueue(p.rightChild); }

28 ASD - Alberi28 strutture dati per alberi binari vettori rappresentazioni collegate esercizi: implementare linterfaccia BinaryTree usando una rappresentazione collegata scrivere un programma che legga gli elementi (stringhe) di un albero binario e li stampi effettuando una visita in preordine

29 ASD - Alberi29 uso di vettori ogni nodo v è memorizzato in posizione p(v) se v è la radice allora p(v)=1 (indice 0 in Java, C, C++) se v è il figlio sinistro di u allora p(v)=2p(u) se v è il figlio destro di u allora p(v)=2p(u)

30 ASD - Alberi30 uso di vettori/2 implementazione statica: è necessaria una stima del numero massimo di nodi dellalbero può portare a spreco di risorse nel caso peggiore, un albero con n nodi richiede un vettore con 2 n -1 elementi (se lalbero degenera in una catena)

31 ASD - Alberi31 uso di vettori/3 in Java: si possono usare le classi Vector (sincronizzata) o ArrayList (non sincronizzata) Vector e ArrayList gestiscono anche il ridimensionamento quando il numero di elementi cresce oltre la capacità corrente ciò porta a ritardi (per gestire lallocazione di nuova memoria) esercizio: scrivere una classe che implementi linterfaccia BinaryTree usando ArrayList o Vector

32 ASD - Alberi32 rappresentazione collegata public class LinkedBinaryTree implements BinaryTree { private BinaryNode root; /* Rif. alla radice*/ private int size; public LinkedBinaryTree() { root = new BinaryTreeNode(null, null, null); size = 0; } /* Metodi */ } /* Fine della classe */


Scaricare ppt "Alberi tipo astratto, implementazione, algoritmi."

Presentazioni simili


Annunci Google