-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTreePrinter.java
More file actions
102 lines (84 loc) · 2.64 KB
/
TreePrinter.java
File metadata and controls
102 lines (84 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* A class used to print a binary tree of integers, for testing purposes
*
* Borrowed from StackOverflow with minor modifications
*
* To use, call the printNode() method, supplying your tree's overall root. Example:
*
* TreePrinter.printNode(tree.getRoot());
*
* where tree is an object of your TreeMethods class, which has a getRoot() method
*/
import java.util.*;
public class TreePrinter
{
/**
* print the tree in a tree-like form
* @param root the overall root of the tree
*/
public static void printTree(Node root) {
int maxLevel = TreePrinter.maxLevel(root);
printNodeInternal(Collections.singletonList(root), 1, maxLevel);
}
private static void printNodeInternal(List<Node> nodes, int level, int maxLevel) {
if (nodes.isEmpty() || TreePrinter.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;
TreePrinter.printWhitespaces(firstSpaces);
List<Node> newNodes = new ArrayList<>();
for (Node node : nodes) {
if (node != null) {
System.out.print(node);
newNodes.add(node.left);
newNodes.add(node.right);
} else {
newNodes.add(null);
newNodes.add(null);
System.out.print(" ");
}
TreePrinter.printWhitespaces(betweenSpaces);
}
System.out.println("");
for (int i = 1; i <= endgeLines; i++) {
for (int j = 0; j < nodes.size(); j++) {
TreePrinter.printWhitespaces(firstSpaces - i);
if (nodes.get(j) == null) {
TreePrinter.printWhitespaces(endgeLines + endgeLines + i + 1);
continue;
}
if (nodes.get(j).left != null)
System.out.print("/");
else
TreePrinter.printWhitespaces(1);
TreePrinter.printWhitespaces(i + i - 1);
if (nodes.get(j).right != null)
System.out.print("\\");
else
TreePrinter.printWhitespaces(1);
TreePrinter.printWhitespaces(endgeLines + endgeLines - i);
}
System.out.println("");
}
printNodeInternal(newNodes, level + 1, maxLevel);
}
private static void printWhitespaces(int count) {
for (int i = 0; i < count; i++)
System.out.print(" ");
}
private static int maxLevel(Node node) {
if (node == null)
return 0;
return Math.max(TreePrinter.maxLevel(node.left), TreePrinter.maxLevel(node.right)) + 1;
}
@SuppressWarnings("rawtypes")
private static boolean isAllElementsNull(List list) {
for (Object object : list) {
if (object != null)
return false;
}
return true;
}
}