Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. /**
  2. * @author Ahmad Ouerfelli
  3. */
  4. public class BinaryTree {
  5.  
  6. private Node root;
  7.  
  8. public void add(BinaryTree tree) {
  9. add(tree.root);
  10. }
  11.  
  12. // IN traversal
  13. private void add(Node br) {
  14. add(br.left);
  15. add(br.n);
  16. add(br.right);
  17. }
  18.  
  19. public void add(int n, int... nums) {
  20. add(n);
  21. for (int num : nums) {
  22. add(num);
  23. }
  24. }
  25.  
  26. private void add(int n) {
  27. if (root == null) {
  28. root = new Node(n);
  29. } else {
  30. add(n, root);
  31. }
  32. }
  33.  
  34. private void add(int n, Node br) {
  35. if (n > br.n) {
  36. if (br.right == null) {
  37. br.right = new Node(n);
  38. } else {
  39. add(n, br.right);
  40. }
  41. } else if (n < br.n) {
  42. if (br.left == null) {
  43. br.left = new Node(n);
  44. } else {
  45. add(n, br.left);
  46. }
  47. }
  48. }
  49.  
  50. // Private because you can't access Node class outside
  51. private Node find(int n) {
  52. return find(n, root);
  53. }
  54.  
  55. private Node find(int n, Node br) {
  56. return br == null || br.n == n ? br : find(n, n > br.n ? br.right : br.left);
  57. }
  58.  
  59. public int depth(int n) {
  60. return depth(n, root, 1);
  61. }
  62.  
  63. private int depth(int n, Node br, int height) {
  64. if (br == null) {
  65. return -1;
  66. }
  67. if (br.n == n) {
  68. return height;
  69. }
  70. return depth(n, br.n < n ? br.left : br.right, height + 1);
  71. }
  72.  
  73. public int countLeaves() {
  74. return countLeaves(root);
  75. }
  76.  
  77. private int countLeaves(Node br) {
  78. if (br == null) {
  79. return 0;
  80. }
  81. if (br.left == null && br.right == null) {
  82. return 1;
  83. }
  84. return countLeaves(br.left) + countLeaves(br.right);
  85. }
  86.  
  87. public int height() {
  88. return maxHeight(root);
  89. }
  90.  
  91. private int maxHeight(Node br) {
  92. return br == null ? 0 : Math.max(maxHeight(br.left), maxHeight(br.right)) + 1;
  93. }
  94.  
  95. private int minHeight(Node br) {
  96. return br == null ? 0 : Math.min(minHeight(br.left), minHeight(br.right)) + 1;
  97. }
  98.  
  99. public void delete(int n) {
  100. root = delete(n, root);
  101. }
  102.  
  103. private Node delete(int n, Node br) {
  104. if (br != null) {
  105. if (n < br.n) {
  106. br.left = delete(n, br.left);
  107. } else if (n > br.n) {
  108. br.right = delete(n, br.right);
  109. } else {
  110. br = delete(br);
  111. }
  112. }
  113. return br;
  114. }
  115.  
  116. private Node delete(Node br) {
  117. if (br.left == null) {
  118. br = br.right;
  119. } else if (br.right == null) {
  120. br = br.left;
  121. } else {
  122. // I opted to use the min-val of right subtree instead of max-val of left subtree, but I don't think it
  123. // really matters in any case.
  124. br.n = findMin(br.right);
  125. br.right = delete(br.n, br.right);
  126. }
  127. return br;
  128. }
  129.  
  130. private int findMin(Node br) {
  131. while (br.left != null) {
  132. br = br.left;
  133. }
  134. return br.n;
  135. }
  136.  
  137. public boolean isAncestor(int ancestor, int descendant) {
  138. return ancestor != descendant && find(descendant, find(ancestor, root)) != null;
  139. }
  140.  
  141. public boolean isBalanced() {
  142. // TODO: What happens if negative?
  143. return maxHeight(root) - minHeight(root) <= 1;
  144. }
  145.  
  146. public void display(Traverse order) {
  147. System.out.println(stringify(order));
  148. }
  149.  
  150. private String stringify(Traverse order) {
  151. String str = stringify(order, root);
  152. // Remove dangling comma
  153. return str.substring(0, str.lastIndexOf(','));
  154. }
  155.  
  156. private String stringify(Traverse order, Node br) {
  157. if (br == null) {
  158. return "";
  159. }
  160. switch (order) {
  161. case IN: {
  162. return stringify(order, br.left) + br + ", " + stringify(order, br.right);
  163. }
  164. case PRE: {
  165. return br + ", " + stringify(order, br.left) + stringify(order, br.right);
  166. }
  167. case POST: {
  168. return stringify(order, br.left) + stringify(order, br.right) + br + ", ";
  169. }
  170. default: {
  171. throw new IllegalArgumentException("Invalid traverse order");
  172. }
  173. }
  174. }
  175.  
  176. @Override
  177. public String toString() {
  178. return stringify(Traverse.IN);
  179. }
  180.  
  181. public BinaryTree() {
  182. }
  183.  
  184. public enum Traverse {
  185. IN, PRE, POST
  186. }
  187.  
  188. private static class Node {
  189.  
  190. private int n;
  191. private Node left;
  192. private Node right;
  193.  
  194. @Override
  195. public String toString() {
  196. return String.valueOf(n);
  197. }
  198.  
  199. public Node(int n) {
  200. this.n = n;
  201. }
  202. }
  203. }
  204.  
  205. /**
  206. * @author Ahmad Ouerfelli
  207. */
  208. class BinaryTreeTest {
  209. public static void main(String... args) {
  210. BinaryTree tree = new BinaryTree();
  211. tree.add(1, 2, 3, 4, 5);
  212. tree.display(BinaryTree.Traverse.PRE);
  213. tree.display(BinaryTree.Traverse.IN);
  214. tree.display(BinaryTree.Traverse.POST);
  215. }
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement