public class BinaryTreePrinter{ static public void printPreOrder(BinaryTree.Node node){ if(node == null){ return; } node.visit(); System.out.print(" "); printPreOrder(node.left); printPreOrder(node.right); } static public void printInOrder(BinaryTree.Node node){ if(node == null){ return; } printInOrder(node.left); node.visit(); System.out.print(" "); printInOrder(node.right); } static public void printPostOrder(BinaryTree.Node node){ if(node == null){ return; } printPostOrder(node.left); printPostOrder(node.right); node.visit(); System.out.print(" "); } static public void printLevelOrder(BinaryTree.Node node){ // 레벨 별로 순회 하는 방법 java.util.Queue> queue = new java.util.LinkedList>(); queue.offer(node); while(queue.peek() != null){ BinaryTree.Node t = queue.poll(); t.visit(); System.out.print(" "); if(t.left != null){ queue.offer(t.left); } if(t.right != null){ queue.offer(t.right); } } } static public void printBFS(BinaryTree.Node node){ java.util.Stack> stack = new java.util.Stack>(); stack.push(node); while(!stack.isEmpty()){ BinaryTree.Node t = stack.pop(); t.visit(); System.out.print(" "); if(t.right != null){ stack.push(t.right); } if(t.left != null){ stack.push(t.left); } } } static public void printInternal(java.util.List> nodes,int level, int maxLevel){ if (nodes.isEmpty() || isAllElementsNull(nodes)) return; int floor = maxLevel - level; int endgeLines = (int) Math.pow(2, (Math.max(floor - 1, 0))); int firstSpaces = (int) Math.pow(2, (floor)) - 1; int betweenSpaces = (int) Math.pow(2, (floor + 1)) - 1; printWhitespaces(firstSpaces); java.util.List> newNodes = new java.util.ArrayList>(); for (BinaryTree.Node node : nodes) { if (node != null) { System.out.print(node.element); newNodes.add(node.left); newNodes.add(node.right); } else { newNodes.add(null); newNodes.add(null); System.out.print(" "); } printWhitespaces(betweenSpaces); } System.out.println(""); for (int i = 1; i <= endgeLines; i++) { for (int j = 0; j < nodes.size(); j++) { printWhitespaces(firstSpaces - i); if (nodes.get(j) == null) { printWhitespaces(endgeLines + endgeLines + i + 1); continue; } if (nodes.get(j).left != null) System.out.print("/"); else printWhitespaces(1); printWhitespaces(i + i - 1); if (nodes.get(j).right != null) System.out.print("\\"); else printWhitespaces(1); printWhitespaces(endgeLines + endgeLines - i); } System.out.println(""); } printInternal(newNodes, level + 1, maxLevel); } static public void print(BinaryTree.Node node){ int maxLevel = getMaxLevel(node); java.util.LinkedList> rootList = new java.util.LinkedList>(); rootList.add(node); printInternal(rootList,1,maxLevel); } static public void printTest(BinaryTree.Node node){ java.util.LinkedList> curLevel = new java.util.LinkedList>(); java.util.LinkedList> nextLevel = curLevel; StringBuilder sb = new StringBuilder(); curLevel.add(node); sb.append(node.element + "\n"); while(nextLevel.size() > 0){ nextLevel = new java.util.LinkedList>(); for (int i = 0; i < curLevel.size(); i++){ BinaryTree.Node cur = curLevel.get(i); if (cur.left != null) { nextLevel.add(cur.left); sb.append(cur.left.element + " "); } if (cur.right != null) { nextLevel.add(cur.right); sb.append(cur.right.element + " "); } } if (nextLevel.size() > 0) { sb.append("\n"); curLevel = nextLevel; } } System.out.println(sb.toString()); } private static boolean isAllElementsNull(java.util.List list) { for (Object object : list) { if (object != null) return false; } return true; } private static void printWhitespaces(int count) { for (int i = 0; i < count; i++) System.out.print(" "); } protected static int getMaxLevel(BinaryTree.Node node){ if(node == null) return 0; return java.lang.Math.max(getMaxLevel(node.left), getMaxLevel(node.right)) + 1; } }