Advertisement
Guest User

Untitled

a guest
Mar 28th, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.88 KB | None | 0 0
  1. public class JoinLevels {
  2.  
  3. private TreeNode root;
  4.  
  5.  
  6. /**
  7. * Constructs a binary tree in order of elements in an array.
  8. * After the number of nodes in the level have maxed, the next
  9. * element in the array would be a child of leftmost node.
  10. *
  11. *
  12. */
  13. public JoinLevels(List<Integer> items) {
  14. create(items);
  15. }
  16.  
  17. private static class TreeNode {
  18. TreeNode left;
  19. int item;
  20. TreeNode right;
  21. TreeNode sibling;
  22.  
  23. TreeNode(TreeNode left, int item, TreeNode right, TreeNode sibling) {
  24. this.left = left;
  25. this.item = item;
  26. this.right = right;
  27. }
  28. }
  29.  
  30. private void create (List<Integer> items) {
  31. root = new TreeNode(null, items.get(0), null, null);
  32.  
  33. final Queue<TreeNode> queue = new LinkedList<TreeNode>();
  34. queue.add(root);
  35.  
  36. final int half = items.size() / 2;
  37.  
  38. for (int i = 0; i < half; i++) {
  39. if (items.get(i) != null) {
  40. final TreeNode current = queue.poll();
  41. final int left = 2 * i + 1;
  42. final int right = 2 * i + 2;
  43.  
  44. if (items.get(left) != null) {
  45. current.left = new TreeNode(null, items.get(left), null, null);
  46. queue.add(current.left);
  47. }
  48. if (right < items.size() && items.get(right) != null) {
  49. current.right = new TreeNode(null, items.get(right), null, null);
  50. queue.add(current.right);
  51. }
  52. }
  53. }
  54. }
  55.  
  56.  
  57.  
  58.  
  59. public void joinWithQueue() {
  60. if (root == null) return;
  61.  
  62. final Queue<TreeNode> queue = new LinkedList<TreeNode>();
  63. queue.add(root);
  64.  
  65. int currentLevelNodesCtr = 1;
  66. int nextLevelNodesCtr = 0;
  67.  
  68. TreeNode prev = null;
  69.  
  70. while (!queue.isEmpty()) {
  71. TreeNode node = queue.poll();
  72. currentLevelNodesCtr--;
  73.  
  74. if (node.left != null) { queue.add(node.left); nextLevelNodesCtr++;};
  75. if (node.right != null) { queue.add(node.right); nextLevelNodesCtr++; };
  76.  
  77. if (prev != null) {
  78. prev.sibling = node;
  79. }
  80. prev = node;
  81.  
  82. if (currentLevelNodesCtr == 0) {
  83. prev = null;
  84. currentLevelNodesCtr = nextLevelNodesCtr;
  85. nextLevelNodesCtr = 0;
  86. }
  87. }
  88. }
  89.  
  90.  
  91.  
  92. public void joinWithList() {
  93. if (root == null) return;
  94. List<TreeNode> nodeList = new ArrayList<TreeNode>();
  95.  
  96. preOrder(root, nodeList, 0);
  97. }
  98.  
  99. private void preOrder (TreeNode node, List<TreeNode> nodeList, int height) {
  100. if (node == null) return;
  101.  
  102. if ((nodeList.size() - 1) >= height) {
  103. nodeList.get(height).sibling = node;
  104. nodeList.set(height, node);
  105. } else {
  106. nodeList.add(node);
  107. }
  108.  
  109. preOrder(node.left, nodeList, height + 1);
  110. preOrder(node.right, nodeList, height + 1);
  111. }
  112.  
  113. public void usingNoStorage() {
  114. if (root == null) return;
  115.  
  116. TreeNode firstNodeAtCurrentLevel = root;
  117.  
  118. while (firstNodeAtCurrentLevel != null) {
  119.  
  120. TreeNode firstNodeAtNextLevel = null;
  121. TreeNode currentNodeAtNextLevel = null;
  122.  
  123. for (TreeNode currentNodeAtCurrentLevel = firstNodeAtCurrentLevel; currentNodeAtCurrentLevel != null; currentNodeAtCurrentLevel = currentNodeAtCurrentLevel.sibling) {
  124.  
  125. if (currentNodeAtCurrentLevel.left != null) {
  126. if (firstNodeAtNextLevel == null) {
  127. firstNodeAtNextLevel = currentNodeAtCurrentLevel.left;
  128. currentNodeAtNextLevel = firstNodeAtNextLevel;
  129. } else {
  130. currentNodeAtNextLevel.sibling = currentNodeAtCurrentLevel.left;
  131. currentNodeAtNextLevel = currentNodeAtNextLevel.sibling;
  132. }
  133. }
  134.  
  135. if (currentNodeAtCurrentLevel.right != null) {
  136.  
  137. if (firstNodeAtNextLevel == null) {
  138. firstNodeAtNextLevel = currentNodeAtCurrentLevel.right;
  139. currentNodeAtNextLevel = firstNodeAtNextLevel;
  140. } else {
  141. currentNodeAtNextLevel.sibling = currentNodeAtCurrentLevel.right;
  142. currentNodeAtNextLevel = currentNodeAtNextLevel.sibling;
  143. }
  144. }
  145. }
  146. firstNodeAtCurrentLevel = firstNodeAtNextLevel;
  147. firstNodeAtNextLevel = null;
  148. }
  149. }
  150. }
  151.  
  152. private void create (List<Integer> items) {
  153. root = new TreeNode(null, items.get(0), null, null);
  154.  
  155. private static final List<Integer> buildList(int[] data) {
  156. List<Integer> result = new ArrayList<>();
  157. for (int v : data) {
  158. result.add(v);
  159. }
  160. return result;
  161. }
  162.  
  163. private static final void printSiblings(String name, int[] reference, JoinLevels jl) {
  164. List<Integer> result = new ArrayList<>();
  165. TreeNode node = jl.root;
  166. while (node != null) {
  167. result.add(node.item);
  168. node = node.sibling;
  169. }
  170. System.out.printf("%sn %sn %sn", name, Arrays.toString(reference), result.toString());
  171. }
  172.  
  173. public static void main(String[] args) {
  174. int[][] values = {
  175. {1, 2, 3, 4, 5, 6, 7, 8, 9},
  176. {1}
  177. };
  178.  
  179. for (int[] data : values) {
  180. JoinLevels jllist = new JoinLevels(buildList(data));
  181. jllist.joinWithList();
  182. printSiblings("List", data, jllist);
  183. JoinLevels jlqueue = new JoinLevels(buildList(data));
  184. jlqueue.joinWithQueue();
  185. printSiblings("Queue", data, jlqueue);
  186. JoinLevels jlnone = new JoinLevels(buildList(data));
  187. jlnone.usingNoStorage();
  188. printSiblings("None", data, jlnone);
  189. }
  190. }
  191.  
  192. List
  193. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  194. [1]
  195. Queue
  196. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  197. [1]
  198. None
  199. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  200. [1]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement