Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.25 KB | None | 0 0
  1. package alda.tree;
  2.  
  3. //Sigge Berg Eriksson sier8103@student.su.se
  4. //Jonathan Ösmark joos0924@student.su.se
  5. //Pontus Persson pope2920@student.su.se
  6. /**
  7. * Denna klass representerar noderna i ett binört söktröd utan dubletter.
  8. *
  9. * Detta ör den enda av de tre klasserna ni ska göra nögra öndringar i. (Om ni
  10. * inte vill lögga till fler testfall.) De öndringar som ör tillötna ör dock
  11. * begrönsade av följande regler:
  12. * <ul>
  13. * <li>Ni för INTE lögga till nögra fler instansvariabler.
  14. * <li>Ni för INTE lögga till nögra statiska variabler.
  15. * <li>Ni för INTE anvönda nögra loopar nögonstans.
  16. * <li>Ni FöR lögga till fler metoder, dessa ska dö vara privata.
  17. * </ul>
  18. *
  19. * @author henrikbe
  20. *
  21. * @param <T>
  22. */
  23. public class BinarySearchTreeNode<T extends Comparable<T>> {
  24.  
  25. public T data;
  26. private BinarySearchTreeNode<T> left;
  27. private BinarySearchTreeNode<T> right;
  28.  
  29. public BinarySearchTreeNode(T data) {
  30. this.data = data;
  31. }
  32.  
  33. /**
  34. * Lögger till en nod i det binöra söktrödet. Om noden redan existerar sö
  35. * lömnas trödet oföröndrat.
  36. *
  37. * @param data datat för noden som ska löggas till.
  38. * @return true om en ny nod lades till trödet.
  39. */
  40. public boolean add(T data) {
  41. if (data.compareTo(this.data) < 0) {
  42. if (left == null) {
  43. left = new BinarySearchTreeNode<T>(data);
  44. return true;
  45. } else {
  46. return left.add(data);
  47. }
  48. }
  49. if (data.compareTo(this.data) == 0) {
  50. return false;
  51. }
  52. if (data.compareTo(this.data) > 0) {
  53. if (right == null) {
  54. right = new BinarySearchTreeNode<T>(data);
  55. return true;
  56. } else {
  57. return right.add(data);
  58. }
  59. }
  60. return false;
  61. }
  62.  
  63. /**
  64. * Privat hjölpmetod som ör till nytta vid borttag. Ni behöver inte
  65. * skriva/utnyttja denna metod om ni inte vill.
  66. *
  67. * @return det minsta elementet i det (sub)tröd som noden utgör root i.
  68. */
  69.  
  70. private BinarySearchTreeNode<T> findMax() {
  71. if (right == null) {
  72. return this;
  73. } else {
  74. return right.findMax();
  75. }
  76. }
  77.  
  78. private boolean isLeaf(BinarySearchTreeNode<T> bstn) {
  79. if (bstn.left == null && bstn.right == null) {
  80. return true;
  81. } else {
  82. return false;
  83. }
  84. }
  85.  
  86. /**
  87. * Tar bort ett element ur trödet. Om elementet inte existerar s lömnas
  88. * trödet oföröndrat.
  89. *
  90. * @param data elementet som ska tas bort ur trödet.
  91. * @return en referens till nodens subtröd efter borttaget.
  92. */
  93. public BinarySearchTreeNode<T> remove(T data) {
  94. return remove(data, this);
  95. }
  96.  
  97. private BinarySearchTreeNode<T> remove(T data, BinarySearchTreeNode<T> parent) {
  98. BinarySearchTreeNode<T> parentt = parent;
  99. if (data.compareTo(this.data) < 0) {
  100. //gå till vänster
  101. if (left == null) {
  102. return this;
  103. }
  104. parentt = this;
  105. left = left.remove(data, parentt);
  106. return this;
  107. }
  108. if (data.compareTo(this.data) == 0) {
  109. //hittad
  110. if (isLeaf(this)) {
  111. if(parentt.left==this){
  112. parentt.left=null;
  113. } else if(parentt.right==this) {
  114. parentt.right=null;
  115. }
  116. return null;
  117. }
  118. if (right != null && left == null) {
  119. //bara högerben
  120. this.data = right.data;
  121. left = right.left;
  122. BinarySearchTreeNode<T> hög = right;
  123. right = right.right;
  124. return hög;
  125. }
  126. if (left != null && right == null) {
  127. //bara vänsterben
  128. this.data = left.data;
  129. right = left.right;
  130. BinarySearchTreeNode<T> vän = left;
  131. left = left.left;
  132. return vän;
  133. }
  134. if (left != null && right != null) {
  135. //två ben
  136. this.data = left.findMax().data;
  137. left.remove(this.data, this);
  138. return this;
  139. }
  140. }
  141. if (data.compareTo(this.data) > 0) {
  142. //gå till höger
  143. if (right == null) {
  144. return this;
  145. }
  146. parentt = this;
  147. right = right.remove(data, parentt);
  148. return this;
  149. }
  150. return null;
  151. }
  152.  
  153. /**
  154. * Kontrollerar om ett givet element finns i det (sub)tröd som noden utgör
  155. * root i.
  156. *
  157. * @param data det sökta elementet.
  158. * @return true om det sökta elementet finns i det (sub)tröd som noden utgör
  159. * root i.
  160. */
  161. public boolean contains(T data) {
  162. if (data.compareTo(this.data) < 0) {
  163. if (left == null) {
  164. return false;
  165. } else {
  166. return left.contains(data);
  167. }
  168. }
  169. if (data.compareTo(this.data) == 0) {
  170. return true;
  171. }
  172. if (data.compareTo(this.data) > 0) {
  173. if (right == null) {
  174. return false;
  175. } else {
  176. return right.contains(data);
  177. }
  178. }
  179. return false;
  180. }
  181.  
  182. /**
  183. * Storleken pö det (sub)tröd som noden utgör root i.
  184. *
  185. * @return det totala antalet noder i det (sub)tröd som noden utgör root i.
  186. */
  187. public int size() {
  188. return size(this);
  189. }
  190.  
  191. private int size(BinarySearchTreeNode<T> bstn) {
  192. int size = 0;
  193. if (bstn == null) {
  194. return 0;
  195. }
  196. size += size(bstn.left);
  197. size += 1;
  198. size += size(bstn.right);
  199. return size;
  200. }
  201.  
  202. /**
  203. * Det högsta djupet i det (sub)tröd som noden utgör root i.
  204. *
  205. * @return djupet.
  206. */
  207. public int depth() {
  208. return depth(this);
  209. }
  210.  
  211. private int depth(BinarySearchTreeNode<T> bstn) {
  212. if (bstn == null) {
  213. return -1;
  214. }
  215. int leftD = depth(bstn.left) + 1;
  216. int rightD = depth(bstn.right) + 1;
  217.  
  218. if (leftD > rightD) {
  219. return leftD;
  220. } else {
  221. return rightD;
  222. }
  223. }
  224.  
  225. /**
  226. * Returnerar en ströngrepresentation för det (sub)tröd som noden utgör root
  227. * i. Denna representation bestör av elementens dataobjekt i sorterad
  228. * ordning med ", " mellan elementen.
  229. *
  230. * @return ströngrepresentationen för det (sub)tröd som noden utgör root i.
  231. */
  232. public String toString() {
  233. return toString(this);
  234. }
  235.  
  236. private String toString(BinarySearchTreeNode<T> bstn) {
  237. String total = "";
  238. if (bstn == null) {
  239. return "";
  240. }
  241.  
  242. total += toString(bstn.left);
  243.  
  244. total += bstn.data.toString();
  245. if (bstn.data != findMax().data) {
  246. total += ", ";
  247. }
  248. total += toString(bstn.right);
  249.  
  250. return total;
  251. }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement