BinaryTree.groovy 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package com.garypaduana.groovytools.data.structure
  2. class BinaryTree {
  3. static class Node {
  4. def leftChild
  5. def rightChild
  6. def element
  7. def parent
  8. Node(def element) {
  9. this.element = element
  10. }
  11. @Override
  12. public String toString() {
  13. return element
  14. }
  15. }
  16. def root
  17. def insert(def element) {
  18. if (root == null) {
  19. root = new Node(element)
  20. } else {
  21. def focusNode = root
  22. while (true) {
  23. if (element < focusNode.element) {
  24. if (focusNode.leftChild == null) {
  25. focusNode.leftChild = new Node(element)
  26. focusNode.leftChild.parent = focusNode
  27. return
  28. } else {
  29. focusNode = focusNode.leftChild
  30. }
  31. } else if (element > focusNode.element) {
  32. if (focusNode.rightChild == null) {
  33. focusNode.rightChild = new Node(element)
  34. focusNode.rightChild.parent = focusNode
  35. return
  36. } else {
  37. focusNode = focusNode.rightChild
  38. }
  39. } else {
  40. return
  41. }
  42. }
  43. }
  44. }
  45. def contains(def element) {
  46. def node = root
  47. while (true) {
  48. if (node == null) {
  49. return false
  50. }
  51. if (element < node.element) {
  52. node = node.leftChild
  53. } else if (element > node.element) {
  54. node = node.rightChild
  55. } else if (element == node.element) {
  56. return true
  57. }
  58. }
  59. }
  60. def preOrderTraverse() {
  61. return preOrderTraverse(root)
  62. }
  63. def preOrderTraverse(def node) {
  64. if (node == null) {
  65. return []
  66. }
  67. def elements = []
  68. elements.add(node.element)
  69. if (node.leftChild != null) {
  70. elements.addAll(preOrderTraverse(node.leftChild))
  71. }
  72. if (node.rightChild != null) {
  73. elements.addAll(preOrderTraverse(node.rightChild))
  74. }
  75. return elements
  76. }
  77. def inOrderTraverse() {
  78. return inOrderTraverse(root)
  79. }
  80. def inOrderTraverse(def node) {
  81. if (node == null) {
  82. return []
  83. }
  84. def elements = []
  85. if (node.leftChild != null) {
  86. elements.addAll(inOrderTraverse(node.leftChild))
  87. }
  88. elements.add(node.element)
  89. if (node.rightChild != null) {
  90. elements.addAll(inOrderTraverse(node.rightChild))
  91. }
  92. return elements
  93. }
  94. def postOrderTraverse() {
  95. return postOrderTraverse(root)
  96. }
  97. def postOrderTraverse(def node) {
  98. if (node == null) {
  99. return []
  100. }
  101. def elements = []
  102. if (node.leftChild != null) {
  103. elements.addAll(postOrderTraverse(node.leftChild))
  104. }
  105. if (node.rightChild != null) {
  106. elements.addAll(postOrderTraverse(node.rightChild))
  107. }
  108. elements.add(node.element)
  109. return elements
  110. }
  111. def iterativePreorderTraverse() {
  112. return iterativePreorderTraverse(root)
  113. }
  114. def iterativePreorderTraverse(def node) {
  115. def elements = []
  116. def parentStack = new Stack()
  117. while (parentStack.size() != 0 || node != null) {
  118. if (node != null) {
  119. elements.add(node.element)
  120. if (node.rightChild != null) {
  121. parentStack.push(node.rightChild)
  122. }
  123. node = node.leftChild
  124. } else {
  125. node = parentStack.pop()
  126. }
  127. }
  128. return elements
  129. }
  130. def iterativeInOrderTraverse() {
  131. return iterativeInOrderTraverse(root)
  132. }
  133. def iterativeInOrderTraverse(def node) {
  134. def elements = []
  135. def parentStack = new Stack()
  136. while (parentStack.size() != 0 || node != null) {
  137. if (node != null) {
  138. parentStack.push(node)
  139. node = node.leftChild
  140. } else {
  141. node = parentStack.pop()
  142. elements.add(node.element)
  143. node = node.rightChild
  144. }
  145. }
  146. return elements
  147. }
  148. def levelOrderTraverse() {
  149. return levelOrderTraverse(root)
  150. }
  151. def levelOrderTraverse(def node) {
  152. def q = new Queue()
  153. q.enqueue(node)
  154. def elements = []
  155. while (q.size() > 0) {
  156. node = q.dequeue()
  157. elements.add(node.element)
  158. if (node.leftChild != null) {
  159. q.enqueue(node.leftChild)
  160. }
  161. if (node.rightChild != null) {
  162. q.enqueue(node.rightChild)
  163. }
  164. }
  165. return elements
  166. }
  167. }