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;
}
}