Guest User

Untitled

a guest
Nov 25th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.27 KB | None | 0 0
  1. package PraktikumBab10;
  2.  
  3. public class AVLTree {
  4. Node akar;
  5. int getTinggi(Node N) {
  6. return (N != null) ? N.tinggi : 0;
  7. }
  8. // Fungsi untuk memutar node melalui y
  9. // Lihat diagram diatas
  10. Node putarKanan(Node y) {
  11. Node x = y.nodeKiri;
  12. Node T2 = x.nodeKanan;
  13. // Melakukan putaran
  14. x.nodeKanan = y;
  15. y.nodeKiri = T2;
  16. // Update tinggi
  17. y.tinggi = Math.max(getTinggi(y.nodeKiri), getTinggi(y.nodeKanan)) + 1;
  18. x.tinggi = Math.max(getTinggi(x.nodeKiri), getTinggi(x.nodeKanan)) + 1;
  19. // hasilkan pasangan node baru
  20. return x;
  21. }
  22. // Fungsi untuk memutar node melalui x
  23. // Lihat diagram diatas
  24. Node putarKiri(Node x) {
  25. Node y = x.nodeKanan;
  26. Node T2 = y.nodeKiri;
  27. // Melakukan putaran
  28. y.nodeKiri = x;
  29. x.nodeKanan = T2;
  30. // Update tinggi
  31. x.tinggi = Math.max(getTinggi(x.nodeKiri), getTinggi(x.nodeKanan)) + 1;
  32. y.tinggi = Math.max(getTinggi(y.nodeKiri), getTinggi(y.nodeKanan)) + 1;
  33. // hasilkan pasangan node baru
  34. return y;
  35. }
  36. // Dapatkan nilai seimbang dari node N
  37. int getBalance(Node N) {
  38. return (N!=null) ? getTinggi(N.nodeKiri) - getTinggi(N.nodeKanan) : 0;
  39. }
  40. Node insert(Node node, int data) {
  41. /* 1. Penambahan Node pada BST biasa */
  42. if (node == null) {
  43. return (new Node(data));
  44. }
  45. if (data < node.data) {
  46. node.nodeKiri = insert(node.nodeKiri, data);
  47. } else if (data > node.data) {
  48. node.nodeKanan = insert(node.nodeKanan, data);
  49. } else // Duplicate datas not allowed
  50. {
  51. return node;
  52. }
  53. /* 2. Update tinggi pada ancestor node */
  54. node.tinggi = 1 + Math.max(getTinggi(node.nodeKiri), getTinggi(node.nodeKanan));
  55. /* 3. Melakukan keseimbangan pada melalui nilai
  56. ancestor untuk mengecek apakah node tidak
  57. seimbang*/
  58. Node result = balance(node, data);
  59. // hasilkan pasangan node baru
  60. return result;
  61. }
  62. Node balance(Node node, int data) {
  63. int balance = getBalance(node);
  64. // Apabila kondisi tidak seimbang maka terjadi rotasi
  65. // Kondisi putar kanan
  66. if (balance > 1 && data < node.nodeKiri.data) {
  67. return putarKanan(node);
  68. }
  69. // Kondisi putar kiri
  70. else if (balance < -1 && data > node.nodeKanan.data) {
  71. return putarKiri(node);
  72. }
  73. // Kondisi putar kiri kanan
  74. else if (balance > 1 && data > node.nodeKiri.data) {
  75. node.nodeKiri = putarKiri(node.nodeKiri);
  76. return putarKanan(node);
  77. }
  78. // Kondisi putar kanan kiri
  79. else if (balance < -1 && data < node.nodeKanan.data) {
  80. node.nodeKanan = putarKanan(node.nodeKanan);
  81. return putarKiri(node);
  82. }
  83. // Kondisi tidak berubah sama sekali
  84. else {
  85. return node;
  86. }
  87. }
  88. void inOrder(Node node) {
  89. if (node != null) {
  90. inOrder(node.nodeKiri);
  91. System.out.print(node.data + " ");
  92. inOrder(node.nodeKanan);
  93. }
  94. }
  95. void preOrder(Node node) {
  96. if (node != null) {
  97. System.out.print(node.data + " ");
  98. preOrder(node.nodeKiri);
  99. preOrder(node.nodeKanan);
  100. }
  101. }
  102.  
  103. public boolean pencarian(Node node, int data){
  104. if(node != null){
  105. if(node.data == data){
  106. return true;
  107. }else{
  108. /*if(node.nodeKiri != null){
  109. return pencarian(node.nodeKiri, data);
  110. }
  111.  
  112. if(node.nodeKanan != null){
  113. return pencarian(node.nodeKanan, data);
  114. }*/
  115. return pencarian(node.nodeKiri, data) || pencarian(node.nodeKanan, data);
  116. }
  117. }else{
  118. return false;
  119. }
  120. }
  121.  
  122. public void pencarian(int data){
  123. /*return pencarian(akar, data);*/
  124. if(pencarian(akar, data))
  125. System.out.println("Data " + data + " ditemukan");
  126. else
  127. System.out.println("Data " + data + " tidak ditemukan");
  128. }
  129.  
  130. Node minValueNode(Node node) {
  131. Node current = node;
  132.  
  133. while (current.nodeKiri != null)
  134. current = current.nodeKiri;
  135.  
  136. return current;
  137. }
  138.  
  139. public int max(int x, int y){
  140. return (x > y)? x : y;
  141. }
  142.  
  143. public Node remove(Node node, int data){
  144. if(node != null){
  145. if(data < node.data){
  146. node.nodeKiri = remove(node.nodeKiri, data);
  147. }else if(data > node.data){
  148. node.nodeKanan = remove(node.nodeKanan, data);
  149. }else{
  150. if(node.nodeKiri == null || node.nodeKanan == null){
  151. Node temp = node.nodeKiri == null? node.nodeKanan : node.nodeKiri;
  152.  
  153. if(temp == null){
  154. temp = node;
  155. node = null;
  156. }else{
  157. node = temp;
  158. }
  159. }else {
  160. Node temp = minValueNode(node.nodeKanan);
  161.  
  162. node.data = temp.data;
  163.  
  164. node.nodeKanan = remove(node.nodeKanan, temp.data);
  165. }
  166. }
  167.  
  168. if(node == null)
  169. return node;
  170.  
  171. node.tinggi = max(getTinggi(node.nodeKiri), getTinggi(node.nodeKanan)) + 1;
  172.  
  173. if(getBalance(node) > 1 && getBalance(node.nodeKiri) >= 0){
  174. return putarKanan(node);
  175. }
  176.  
  177. if(getBalance(node) > 1 && getBalance(node.nodeKiri) < 0){
  178. node.nodeKiri = putarKiri(node.nodeKiri);
  179. return putarKanan(node);
  180. }
  181.  
  182. if(getBalance(node) < -1 && getBalance(node.nodeKanan) <= 0){
  183. return putarKiri(node);
  184. }
  185.  
  186. if(getBalance(node) < -1 && getBalance(node.nodeKanan) > 0){
  187. node.nodeKanan = putarKanan(node.nodeKanan);
  188. return putarKiri(node);
  189. }
  190. }
  191.  
  192. return node;
  193. }
  194.  
  195. public int nodeLevel(int n){
  196. if(n == 0)
  197. return 1;
  198. else if(n == 1)
  199. return 2;
  200. else if(n == 2)
  201. return 4;
  202. else
  203. return 1 + nodeLevel(n-1) + nodeLevel(n-2);
  204. }
  205. }
Add Comment
Please, Sign In to add comment