Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.66 KB | None | 0 0
  1.  
  2. /**
  3. * Created by Mohy on 4/28/2017.
  4. */
  5. public class AVLTree<T extends Comparable<T>> {
  6. Node root;
  7.  
  8. int height(Node n) {
  9. if (n == null)
  10. return 0;
  11. return n.height;
  12. }
  13.  
  14. int getHeight(Node n) {
  15. if (n == null)
  16. return 0;
  17. return 1 + Math.max(getHeight(n.left), getHeight(n.right));
  18.  
  19. }
  20.  
  21. Node rightRotate(Node n) {
  22. Node newRoot = n.left;
  23. Node temp = newRoot.right;
  24. newRoot.right = n;
  25. n.left = temp;
  26. n.height = Math.max(height(n.left), height(n.right)) + 1;
  27. newRoot.height = Math.max(height(newRoot.left), height(newRoot.right)) + 1;
  28. return newRoot;
  29. }
  30.  
  31. Node leftRotate(Node n) {
  32. Node newRoot = n.right;
  33. Node temp = newRoot.left;
  34. newRoot.left = n;
  35. n.right = temp;
  36. n.height = Math.max(height(n.left), height(n.right)) + 1;
  37. newRoot.height = Math.max(height(newRoot.left), height(newRoot.right)) + 1;
  38. return newRoot;
  39. }
  40. int getBalance(Node n) {
  41. if (n == null) {
  42. return 0;
  43. }
  44. return height(n.left) - height(n.right);
  45. }
  46.  
  47. Node search(Node<T> n, T key) {
  48. if (n == null)
  49. return null;
  50. Node temp;
  51. if (key.compareTo(n.key) > 0) {
  52. temp = search(n.left, key);
  53. } else temp = search(n.right, key);
  54. return temp;
  55. }
  56.  
  57. Node insert(Node<T> n, T key) {
  58. if (n == null)
  59. return (new Node<T>(key));
  60. if (key.compareTo(n.key) < 0) {
  61. n.left = insert(n.left, key);
  62. } else if (key.compareTo(n.key) > 0) {
  63. n.right = insert(n.right, key);
  64. } else return n;// duplicate case not allowed
  65. n.height = Math.max(height(n.left), height(n.right)) + 1;
  66. int balance = getBalance(n);
  67. if (balance > 1 && key.compareTo((T) n.left.key)< 0) {//left left insertion case
  68. return rightRotate(n);
  69. }
  70. if (balance < -1 && n.right.key.compareTo(key) < 0) {//right right insertion case
  71. return leftRotate(n);
  72. }
  73. if (balance > 1 && n.left.key.compareTo(key) < 0) { //left right insertion
  74. n.left = leftRotate(n.left);
  75. return rightRotate(n);
  76. }
  77. if (balance < -1 && n.right.key.compareTo(key) > 0) {//right left insertion
  78. n.right = rightRotate(n.right);
  79. return leftRotate(n);
  80. }
  81. return n;
  82. }
  83.  
  84. T getMinValue(Node node) {
  85. // if (node == null) return Integer.MIN_VALUE;
  86. if (node.left == null) return (T) node.key;
  87. return getMinValue(node.left);
  88. }
  89.  
  90. private Node delete(Node<T> node, T data) {
  91.  
  92. if (node == null) return null;
  93.  
  94. if (data.compareTo(node.key) > 0) {
  95. node.left = delete(node.left, data);
  96. }
  97. if (data.compareTo(node.key) < 0) {
  98. node.right = delete(node.right, data);
  99. } else {
  100.  
  101. if (node.left == null && node.right != null) {
  102. node = node.right;
  103.  
  104. } else if (node.right == null && node.left != null) {
  105. node = node.left;
  106. } else {
  107. T O = getMinValue(node.right);
  108. node.key = O;
  109. node.right = delete(node.right, O);
  110. }
  111. }
  112. if (node == null) {
  113. return null;
  114. }
  115.  
  116. node.height = getHeight(node);
  117.  
  118. int balance = getBalance(node);
  119.  
  120. if (balance > 1) {
  121. if (getBalance(node.left) >= 0) {
  122. node = rightRotate(node);
  123. } else {
  124. node.left = leftRotate(node.left);
  125. node = rightRotate(node);
  126. }
  127. } else if (balance < -1) {
  128. if (getBalance(node.right) <= 0) {
  129. node = leftRotate(node);
  130. } else {
  131. node.right = rightRotate(node.right);
  132. node = leftRotate(node);
  133. }
  134. }
  135. return node;
  136. }
  137.  
  138. public static void printAvlTree(Node n) {
  139. if (n == null) return;
  140. printAvlTree(n.right);
  141. printAvlTree(n.left);
  142. System.out.print(" " + n.key);
  143. }
  144.  
  145. public static void main(String[] args) {
  146. AVLTree<Integer> tree = new AVLTree<>();
  147. tree.root = tree.insert(tree.root, 5);
  148. tree.root = tree.insert(tree.root, 10);
  149. tree.root = tree.insert(tree.root, 8);
  150. tree.root = tree.insert(tree.root, 9);
  151. tree.root = tree.insert(tree.root, 7);
  152. printAvlTree(tree.root);
  153. }
  154.  
  155.  
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement