Alberi Definizioni principali Un albero è una struttura dati che contiene oggetti organizzati gerarchicamente (a differenza della lista di nodi, dell'array list, i cui elementi sono organizzati linearmente) radice Ciascun elemento dell'albero (ad eccezione della radice) ha un padre e zero o più figli Strutture Dati Alberi Padre Ciascun nodo v di T diverso dalla radice ha un unico padre w w v Strutture Dati Alberi Figli w Strutture Dati Tutti i nodi che hanno w come padre sono figli di w Alberi Fratelli w Tutti i nodi che sono figli dello stesso padre sono detti fratelli Strutture Dati Alberi Foglie I nodi che non hanno figli sono chiamati foglie Strutture Dati Alberi Nodi interni I nodi che hanno almeno un figlio sono chiamati nodi interni Strutture Dati Alberi Antenati e discendenti Un nodo u è un antenato di un nodo v se: u = v oppure u è un antenato del padre di v u Un nodo v è un discendente di un nodo u se: u è un antenato di v w v Strutture Dati Alberi Sottoalberi Un sottoalbero di un albero T radicato a v è un albero che consiste di tutti i discendenti di v v Strutture Dati Alberi Profondità La profondità di un nodo v è il numero di antenati di v (escluso v) Ricorsivamente: v Strutture Dati 2 ● ● se v è la radice, la profondità di v è 0 altrimenti la profondità di v è la profondità del padre di v più 1 Alberi Altezza v 3 L'altezza di un nodo v è il massimo numero di discendenti di v (escluso v) su un cammino che va da v a una foglia Ricorsivamente: se v è una foglia, l'altezza di v è 0 ● altrimenti l'altezza di v è la massima altezza fra i figli di v più 1 ● Strutture Dati Alberi Visita preorder La visita preorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si visita la radice di T - poi si fa una visita preorder per ciascuno dei sottoalberi radicati nei suoi figli Strutture Dati Alberi Visita preorder La visita preorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si visita la radice di T - poi si fa una visita preorder per ciascuno dei sottoalberi radicati nei suoi figli Strutture Dati Alberi Visita preorder La visita preorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si visita la radice di T - poi si fa una visita preorder per ciascuno dei sottoalberi radicati nei suoi figli Strutture Dati Alberi Visita preorder La visita preorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si visita la radice di T - poi si fa una visita preorder per ciascuno dei sottoalberi radicati nei suoi figli Strutture Dati Alberi Visita preorder La visita preorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si visita la radice di T - poi si fa una visita preorder per ciascuno dei sottoalberi radicati nei suoi figli Strutture Dati Alberi Visita postorder La visita postorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si fa una visita postorder dei sottoalberi radicati nei figli della radice - poi si visita la radice di T Strutture Dati Alberi Visita postorder La visita postorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si fa una visita postorder dei sottoalberi radicati nei figli della radice - poi si visita la radice di T Strutture Dati Alberi Visita postorder La visita postorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si fa una visita postorder dei sottoalberi radicati nei figli della radice - poi si visita la radice di T Strutture Dati Alberi Visita postorder La visita postorder di un albero T è una visita dei nodi di T che si può definire ricorsivamente nel modo seguente: - prima si fa una visita postorder dei sottoalberi radicati nei figli della radice - poi si visita la radice di T Strutture Dati Il tipo astratto di dati Albero Tipo di dati e operazioni Come l'ADT lista, anche l'ADT albero usa la nozione di posizione (position) per memorizzare i suoi elementi Anche qui un oggetto Position offre il seguente metodo: element(): restituisce l'oggetto memorizzato in questa posizione Strutture Dati Il tipo astratto di dati Albero Tipo di dati e operazioni Metodi generici size(): restituisce il numero dei nodi dell'albero isEmpty(): verifica se l'albero è vuoto iterator(): restituisce un iteratore degli elementi nei nodi dell'albero positions(): restituisce un iteratore dei nodi dell'albero Metodi di accesso root(): restituisce la radice dell'albero; si verifica un errore se l'albero è vuoto parent(v): restituisce il padre di v; si verifica un errore se v è la radice children(v): restituisce un iteratore delle posizioni dei figli di v Strutture Dati Il tipo astratto di dati Albero Tipo di dati e operazioni Metodi di interrogazione: isInternal(v): verifica se v è un nodo interno isExternal(v): verifica se v è una foglia isRoot(v): verifica se v è la radice Metodi di modifica: replace(v, e): rimpiazza con e l'elemento nel nodo v e restituisce il vecchio elemento addRoot(e): aggiunge la radice (che conterrà l'elemento e) ad un albero vuoto insertChild(v,e): aggiunge un nuovo figlio al nodo v (il nuovo figlio conterrà l'elemento e) ... Strutture Dati Il tipo astratto di dati Albero Eccezioni InvalidPositionException ogni metodo che prende in input una posizione, lancia una InvalidPositionException se questa posizione è invalida; BoundaryViolationException parent(v) lancia una BoundaryViolationException se il nodo v è la radice dell'albero; EmptyTreeException root() lancia una EmptyTreeException se invocato su un albero vuoto. NonEmptyTreeException addRoot(e) lancia una NonEmptyTreeException se invocato su un albero non vuoto. Strutture Dati