Advertisement
Guest User

Untitled

a guest
Jul 7th, 2015
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.66 KB | None | 0 0
  1. package tree;
  2.  
  3. import java.util.Iterator;
  4. import node.DNode;
  5. import position.NodePositionList;
  6. import position.Position;
  7. import position.PositionList;
  8. import exception.BoundaryViolationException;
  9. import exception.EmptyTreeException;
  10. import exception.InvalidPositionException;
  11. import exception.NonEmptyTreeException;
  12. import exception.UndeletableNodeException;
  13.  
  14. public class LinkedTree<E> implements Tree<E> {
  15.  
  16. protected TreePosition<E> root;
  17. protected int size;
  18.  
  19. public LinkedTree(){
  20. root = null;
  21. size = 0;
  22. }
  23.  
  24. protected TreePosition<E> checkPosition(Position<E> v){
  25. if ((v==null)||!(v instanceof TreePosition))
  26. throw new InvalidPositionException("Posizione non valida");
  27. return (TreePosition<E>)v;
  28. }
  29.  
  30. public Iterator<E> iterator() {
  31. Iterable<Position<E>> positions = positions();
  32. PositionList<E> elements = new NodePositionList<E>();
  33. for(Position<E> pos : positions)
  34. elements.addLast(pos.element());
  35. return elements.iterator();
  36. }
  37.  
  38. public int size() {
  39. return size;
  40. }
  41.  
  42. public boolean isEmpty() {
  43. return (size == 0);
  44. }
  45.  
  46. public Iterable<Position<E>> positions() {
  47. PositionList<Position<E>> positions = new NodePositionList<Position<E>>();
  48. if(size!= 0) preorderPositions(root,positions);
  49. return positions;
  50. }
  51.  
  52. public void preorderPositions(Position<E> v, PositionList<Position<E>> pos) throws InvalidPositionException{
  53. checkPosition(v);
  54. pos.addLast(v);
  55. if(isInternal(v))
  56. for(Position<E> w : children(v))
  57. preorderPositions(w,pos);
  58. }
  59.  
  60. public Position<E> root() throws EmptyTreeException {
  61. if(root==null) throw new EmptyTreeException("Albero vuoto");
  62. return root;
  63. }
  64.  
  65. public Position<E> parent(Position<E> v) throws InvalidPositionException, BoundaryViolationException {
  66. TreePosition<E> vv = checkPosition(v);
  67. if(isRoot(v)) throw new BoundaryViolationException("Root non ha padre");
  68. return vv.getParent();
  69. }
  70.  
  71. public Iterable<Position<E>> children(Position<E> v) throws InvalidPositionException {
  72. TreePosition<E> vv = checkPosition(v);
  73. if(isExternal(v)) throw new InvalidPositionException("Una foglia non ha figli");
  74. return vv.getChildren();
  75. }
  76.  
  77. public boolean isInternal(Position<E> v) throws InvalidPositionException {
  78. return !isExternal(v);
  79. }
  80.  
  81. public boolean isExternal(Position<E> v) throws InvalidPositionException {
  82. TreePosition<E> vv = checkPosition(v);
  83. return (vv.getChildren()==null)||(vv.getChildren().isEmpty());
  84. }
  85.  
  86. public boolean isRoot(Position<E> v) throws InvalidPositionException {
  87. checkPosition(v);
  88. return (v==root());
  89. }
  90.  
  91. public E replace(Position<E> v, E e) throws InvalidPositionException {
  92. TreePosition<E> vv = checkPosition(v);
  93. E temp = vv.element();
  94. vv.setElement(e);
  95. return temp;
  96. }
  97.  
  98. public Position<E> addRoot(E e) throws NonEmptyTreeException {
  99. if(!isEmpty()) throw new NonEmptyTreeException("Albero non vuoto");
  100. size=1;
  101. root = new TreeNode<E>(e,null,null);
  102. return root;
  103. }
  104.  
  105. public Position<E> addChild(Position<E> v, E e) throws InvalidPositionException {
  106. TreePosition<E> vv = checkPosition(v);
  107. TreePosition<E> ww = new TreeNode<E>(e,vv,null);
  108. PositionList<Position<E>> children = vv.getChildren();
  109. if(children==null){
  110. children = new NodePositionList<Position<E>>();
  111. vv.setChildren(children);
  112. }
  113. children.addLast(ww);
  114. size++;
  115. return ww;
  116. }
  117.  
  118. public E removeRoot() throws EmptyTreeException, UndeletableNodeException{
  119. if(isEmpty()) throw new EmptyTreeException("Albero vuoto");
  120. if(size>1) throw new UndeletableNodeException("L'albero contiene più di un nodo");
  121. TreePosition<E> pos = checkPosition(root);
  122. E value = pos.element();
  123. pos.setElement(null);
  124. pos.setParent(null);
  125. size--;
  126. return value;
  127. }
  128.  
  129. public E removeExternalChild(Position<E> v) throws UndeletableNodeException, InvalidPositionException{
  130. TreePosition<E> vv = checkPosition(v);
  131. Position<E> children = vv.getChildren().first().element();
  132. if(isExternal(v)) throw new InvalidPositionException("Posizione non valida");
  133. if(isInternal(children)) throw new UndeletableNodeException("Il figlio non è una foglia");
  134. return remove(children);
  135. }
  136.  
  137. public E remove(Position<E> v) throws InvalidPositionException {
  138. if(isEmpty()) throw new InvalidPositionException("Albero vuoto");
  139. else {
  140. TreePosition<E> pos = checkPosition(v);
  141. E value = pos.element();
  142. if(isExternal(v)) {
  143. PositionList<Position<E>> parChildList = pos.getParent().getChildren();
  144. parChildList.remove(parChildList.first());
  145. pos.setElement(null);
  146. pos.setParent(null);
  147. size--;
  148. }
  149. return value;
  150. }
  151. }
  152.  
  153. public String toString(){
  154. String s = positions().toString();
  155. return s;
  156. }
  157.  
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement