Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. public class SplayWithGet<E extends Comparable<? super E>> extends BinarySearchTree<E> implements CollectionWithGet<E> {
  2.  
  3. /**
  4. * Global variable which contains the value of the last compareTo call when finding elements in the tree.
  5. * It is used to lower the amount of calls to compareTo.
  6. */
  7. private int jfr;
  8.  
  9. /**
  10. * Retrieves the given element and put the element as root by rotating the nodes.
  11. * Returns null if the element doesn't exist in the tree.
  12. * @param element The element of interest
  13. * @return The element of interest
  14. */
  15. @Override
  16.  
  17. public E get(E element) {
  18. if (element == null) {
  19. throw new NullPointerException("Tada nullpointer");
  20. }
  21.  
  22. if(root == null){return null;}
  23. Entry entry = find(element, root);
  24.  
  25.  
  26. if(entry == null){return null;}
  27. splay(entry);
  28.  
  29.  
  30. if(entry != root) {
  31. if (entry == entry.parent.left) {
  32. zig(entry.parent);
  33. entry = entry.parent;
  34. } else if (entry == entry.parent.right) {
  35. zag(entry.parent);
  36. entry = entry.parent;
  37. }
  38. }
  39.  
  40. if(jfr == 0){
  41. return entry.element;
  42. } else {
  43. return null;
  44. }
  45. }
  46.  
  47. /**
  48. * Rotates the nodes until entry is root or one level beneath root
  49. * @param entry
  50. */
  51. protected void splay(Entry entry){
  52. while (entry.parent != null && entry.parent.parent != null) {
  53. Entry parent = entry.parent;
  54. Entry grandparent = parent.parent;
  55.  
  56. if (parent.left == entry) {
  57. if (grandparent.left == parent) {
  58. zigzig(entry);
  59. entry = grandparent;
  60. } else if (grandparent.right == parent) {
  61. zagzig(grandparent);
  62. entry = grandparent;
  63. }
  64. } else if (parent.right == entry) {
  65. if (grandparent.left == parent) {
  66. zigzag(grandparent);
  67. entry = grandparent;
  68. } else if (grandparent.right == parent) {
  69. zagzag(entry);
  70. entry = grandparent;
  71. }
  72. }
  73. }
  74. }
  75.  
  76.  
  77. /**
  78. * searches the tree for the given element and returns it if it is found. If
  79. * the element is not found it will return the closest element.
  80. * @param elem
  81. * @param t
  82. * @return
  83. */
  84. protected Entry find( E elem, Entry t ) {
  85. if ( t == null )
  86. return null;
  87. else {
  88. jfr = elem.compareTo( t.element );
  89. if ( jfr < 0 ) {
  90. if (t.left == null)
  91. return t;
  92. return find(elem, t.left);
  93. }else if ( jfr > 0 ) {
  94. if (t.right == null)
  95. return t;
  96. return find(elem, t.right);
  97. }else
  98. return t;
  99. }
  100. } // find
  101.  
  102. // ========== ========== ========== ==========
  103.  
  104. /* Rotera 1 steg i hogervarv, dvs
  105. x' y'
  106. / \ / \
  107. y' C --> A x'
  108. / \ / \
  109. A B B C
  110. */
  111. private void zig (Entry x ){
  112. Entry y = x.left;
  113. E temp = x.element;
  114. x.element = y.element;
  115. y.element = temp;
  116. x.left = y.left;
  117. if (x.left != null)
  118. x.left.parent = x;
  119. y.left = y.right;
  120. y.right = x.right;
  121. if (y.right != null)
  122. y.right.parent = y;
  123. x.right = y;
  124.  
  125. } // rotateRight
  126. // ========== ========== ========== ==========
  127.  
  128. /* Rotera 1 steg i vanstervarv, dvs
  129. x' y'
  130. / \ / \
  131. A y' --> x' C
  132. / \ / \
  133. B C A B
  134. */
  135. private void zag (Entry x ){
  136. Entry y = x.right;
  137. E temp = x.element;
  138. x.element = y.element;
  139. y.element = temp;
  140. x.right = y.right;
  141. if (x.right != null)
  142. x.right.parent = x;
  143. y.right = y.left;
  144. y.left = x.left;
  145. if (y.left != null)
  146. y.left.parent = y;
  147. x.left = y;
  148. } // rotateLeft
  149. // ========== ========== ========== ==========
  150.  
  151. /* Rotera 2 steg i hogervarv, dvs
  152. x' z'
  153. / \ / \
  154. y' D --> y' x'
  155. / \ / \ / \
  156. A z' A B C D
  157. / \
  158. B C
  159. */
  160. private void zigzag (Entry x ){
  161. Entry y = x.left,
  162. z = x.left.right;
  163. E e = x.element;
  164.  
  165. x.element = z.element;
  166. z.element = e;
  167. y.right = z.left;
  168. if (y.right != null)
  169. y.right.parent = y;
  170. z.left = z.right;
  171. z.right = x.right;
  172. if (z.right != null)
  173. z.right.parent = z;
  174. x.right = z;
  175. z.parent = x;
  176. } // doubleRotateRight
  177. // ========== ========== ========== ==========
  178.  
  179. /* Rotera 2 steg i vanstervarv, dvs
  180. x' z'
  181. / \ / \
  182. A y' --> x' y'
  183. / \ / \ / \
  184. z D A B C D
  185. / \
  186. B C
  187. */
  188. private void zagzig (Entry x ){
  189. Entry y = x.right,
  190. z = x.right.left;
  191. E e = x.element;
  192. x.element = z.element;
  193. z.element = e;
  194. y.left = z.right;
  195. if (y.left != null)
  196. y.left.parent = y;
  197. z.right = z.left;
  198. z.left = x.left;
  199. if (z.left != null)
  200. z.left.parent = z;
  201. x.left = z;
  202. z.parent = x;
  203. } // doubleRotateLeft
  204.  
  205. private void zigzig (Entry x){
  206. zig(x.parent.parent);
  207. zig(x.parent);
  208. }
  209.  
  210. private void zagzag (Entry x){
  211. zag(x.parent.parent);
  212. zag(x.parent);
  213. }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement