Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.09 KB | None | 0 0
  1. package Upg8;
  2.  
  3. import java.util.NoSuchElementException;
  4.  
  5. public class BinarySearchTree<E extends Comparable<E>> {
  6.  
  7. private static class Node<E>{
  8. private E data;
  9. private Node<E> left, right;
  10. public Node(E data) {
  11. this.data = data;
  12. left = right = null;
  13. }
  14. @Override
  15. public String toString() {
  16. return data.toString();
  17. }
  18. }
  19.  
  20. private Node<E> root;
  21. private E deletedData;
  22.  
  23. public BinarySearchTree() {
  24. this.root = null;
  25. deletedData = null;
  26. }
  27.  
  28. public boolean add(E data){
  29. if(root == null) {
  30. root = new Node<E>(data);
  31. return true;
  32. } else return add(data,root);
  33. }
  34.  
  35. private boolean add(E data, Node<E> node) {
  36. if(data.compareTo(node.data) == 0)
  37. return false;
  38. else if(data.compareTo(node.data) < 0)
  39. if (node.left == null){
  40. node.left = new Node<E>(data);
  41. return true;
  42. } else return add(data, node.left);
  43. else
  44. if(node.right == null){
  45. node.right = new Node<E>(data);
  46. return true;
  47. } else return add(data, node.right);
  48. }
  49.  
  50. public E findRec(E target){
  51. return findRec(target, root);
  52. }
  53.  
  54. private E findRec(E target, Node<E> node){
  55. if(node == null) return null;
  56. int tmp = target.compareTo(node.data);
  57. if(tmp == 0)
  58. return node.data;
  59. if(tmp < 0)
  60. return findRec(target, node.left);
  61. return findRec(target,node.right);
  62. }
  63.  
  64. public E findIter(E target){
  65. if(root == null)
  66. return null;
  67. Node<E> index = root;
  68. while (index != null){
  69. int tmp = target.compareTo(index.data);
  70. if(tmp == 0)
  71. return index.data;
  72. else if(tmp < 0)
  73. index = index.left;
  74. else index = index.right;
  75. }
  76. return null;
  77. }
  78.  
  79. public E maxIt(){
  80. if(root == null)
  81. return null;
  82. Node<E> max = root;
  83. while (max.right != null){
  84. max = max.right;
  85. }
  86. return max.data;
  87. }
  88.  
  89. public E maxRec(){
  90. if(root == null)
  91. return null;
  92. return maxRec(root);
  93. }
  94.  
  95. private E maxRec(Node<E> index){
  96. if(index.right == null)
  97. return index.data;
  98. else return maxRec(index.right);
  99. }
  100.  
  101. public E delete(E target){
  102. root = delete(target, root);
  103. return deletedData;
  104. }
  105.  
  106. private Node<E> delete(E target, Node<E> node){
  107. if(node == null){ //Target is not in tree
  108. deletedData = null;
  109. return null;
  110. } else {
  111. if(target.compareTo(node.data)<0){ //Target is on Tree's left side
  112. node.left = delete(target,node.left);
  113. return node;
  114. } else if(target.compareTo(node.data)>0){ //Target in on Tree's right side
  115. node.right = delete(target,node.right);
  116. return node;
  117. } else { //Target finns i node
  118. deletedData = node.data; //Store data to return
  119. //Now reconstruction of the tree
  120. if(node.left == null) //Node to remove doesn't have left tree
  121. return node.right;
  122. else if(node.right == null) //Node to remove doesn't have right tree
  123. return node.left;
  124. else { //Node to remove have two children
  125. Node<E> nodeToMove=node.right, parentNodeToMove=node;
  126. if(nodeToMove.left==null){ //Right children have no left child
  127. nodeToMove.left=node.left;
  128. return nodeToMove;
  129. }
  130. //Right children have left children
  131. while (nodeToMove.left!=null){
  132. parentNodeToMove = nodeToMove;
  133. nodeToMove = nodeToMove.left;
  134. }
  135. parentNodeToMove.left = nodeToMove.right;
  136. node.data = nodeToMove.data;
  137. return node;
  138. }
  139. }
  140. }
  141. }
  142.  
  143. private void inOrder(Node<E> node, StringBuilder sb){
  144. if(node!=null){
  145. inOrder(node.left, sb);
  146. sb.append(": ").append(node.toString());
  147. inOrder(node.right, sb);
  148. }
  149. }
  150.  
  151. private void preOrder(Node<E> node, StringBuilder sb){
  152. if(node!=null){
  153. sb.append(": ").append(node.toString());
  154. preOrder(node.left, sb);
  155. preOrder(node.right, sb);
  156. }
  157. }
  158.  
  159. private void postOrder(Node<E> node, StringBuilder sb){
  160. if(node!=null){
  161. postOrder(node.left, sb);
  162. postOrder(node.right, sb);
  163. sb.append(": ").append(node.toString());
  164. }
  165. }
  166.  
  167. @Override
  168. public String toString() {
  169. StringBuilder sb = new StringBuilder();
  170. inOrder(root, sb);
  171. return sb.toString();
  172. }
  173.  
  174. public String toStringPreOrder() {
  175. StringBuilder sb = new StringBuilder();
  176. preOrder(root, sb);
  177. return sb.toString();
  178. }
  179.  
  180. public String toStringPostOrder() {
  181. StringBuilder sb = new StringBuilder();
  182. postOrder(root, sb);
  183. return sb.toString();
  184. }
  185.  
  186. public static void main(String[] args) {
  187. BinarySearchTree<Integer> bst = new BinarySearchTree<>();
  188. bst.add(4);
  189. bst.add(2);
  190. bst.add(1);
  191. bst.add(3);
  192. bst.add(6);
  193. bst.add(5);
  194. bst.add(7);
  195. System.out.println("Inorder" + bst.toString());
  196. System.out.println("Find 3: " + bst.findRec(3));
  197. System.out.println("Find Iter 3: " + bst.findIter(3));
  198. System.out.println("Find 8 (doesn't exists) : " + bst.findIter(8));
  199. System.out.println("Max Iterative: " + bst.maxIt());
  200. System.out.println("Max Recursive: " + bst.maxRec());
  201. }
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement