package it.algoritmi.adt.tree; import java.util.ArrayList; import java.util.List; import it.algoritmi.adt.BinaryTree; import it.algoritmi.adt.Position; /** Una classe di base astratta che implementain parte l'interfaccia BinaryTree */ public abstract class AbstractBinaryTree extends AbstractTree implements BinaryTree { /** * Restituisce la posizione del fratello di position (o null se non esiste). * @param position il nodo che vuoi ispezionare * @return la posizione del fratello di posistion o null se non esiste */ @Override public Position sibling(Position position) { Position parent = parent(position); if(parent == null) return null; // position è la radice if(position == left(position)) // position è il figlio sinistro return right(position); // può essere null else // position è il figlio destro return left(parent); // può essere null } /** * Restituisce il numero di figli della Position position * @param position * @return restituisce il numero di figli della Position position */ @Override public int numChildren(Position position) { int count = 0; if(left(position) != null) ++count; if(right(position) != null) ++count; return count; } /** * Restituisce un contenitore iterabile delle posizione dei figli di position * @param position * @return restituisce un contenitore iterabile delle posizione dei figli di position */ @Override public Iterable> children(Position position) { List> snapshot = new ArrayList<>(2); // capacità massima if(left(position) != null) snapshot.add(left(position)); if(right(position) != null) snapshot.add(right(position)); return snapshot; } /** * Aggiunge a snapshot le posizioni del sottoalbero avente radice position. * @param position * @param snapshot */ private void inorderSubtree(Position position, List> snapshot) { if(left(position) != null) inorderSubtree(left(position), snapshot); snapshot.add(position); if(right(position) != null) inorderSubtree(right(position), snapshot); } /** * Restituisce una lista delle posizioni dell'albero, in ordine simmetrico * @return lista delle posizioni in ordine simmetrico */ protected Iterable> inorder() { List> snapshot = new ArrayList<>(); if(!isEmpty()) inorderSubtree(root(), snapshot); return snapshot; } /** * Restituisce una lista delle posizioni dell'albero * @return lista delle posizioni. */ @Override public Iterable> positions() { return inorder(); } }