Skip to content

Commit 2e1d1ff

Browse files
authored
Merge pull request eugenp#8218 from yavuztas/pr-BAEL-3408
Source code for BAEL-3408
2 parents 5e8882a + aeb2681 commit 2e1d1ff

File tree

3 files changed

+278
-0
lines changed

3 files changed

+278
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.baeldung.printbinarytree;
2+
3+
public class BinaryTreeModel {
4+
5+
private Object value;
6+
private BinaryTreeModel left;
7+
private BinaryTreeModel right;
8+
9+
public BinaryTreeModel(Object value) {
10+
this.value = value;
11+
}
12+
13+
public Object getValue() {
14+
return value;
15+
}
16+
17+
public void setValue(Object value) {
18+
this.value = value;
19+
}
20+
21+
public BinaryTreeModel getLeft() {
22+
return left;
23+
}
24+
25+
public void setLeft(BinaryTreeModel left) {
26+
this.left = left;
27+
}
28+
29+
public BinaryTreeModel getRight() {
30+
return right;
31+
}
32+
33+
public void setRight(BinaryTreeModel right) {
34+
this.right = right;
35+
}
36+
37+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.baeldung.printbinarytree;
2+
3+
import java.io.PrintStream;
4+
5+
public class BinaryTreePrinter {
6+
7+
private BinaryTreeModel tree;
8+
9+
public BinaryTreePrinter(BinaryTreeModel tree) {
10+
this.tree = tree;
11+
}
12+
13+
private String traversePreOrder(BinaryTreeModel root) {
14+
15+
if (root == null) {
16+
return "";
17+
}
18+
19+
StringBuilder sb = new StringBuilder();
20+
sb.append(root.getValue());
21+
22+
String pointerRight = "└──";
23+
String pointerLeft = (root.getRight() != null) ? "├──" : "└──";
24+
25+
traverseNodes(sb, "", pointerLeft, root.getLeft(), root.getRight() != null);
26+
traverseNodes(sb, "", pointerRight, root.getRight(), false);
27+
28+
return sb.toString();
29+
}
30+
31+
private void traverseNodes(StringBuilder sb, String padding, String pointer, BinaryTreeModel node,
32+
boolean hasRightSibling) {
33+
34+
if (node != null) {
35+
36+
sb.append("\n");
37+
sb.append(padding);
38+
sb.append(pointer);
39+
sb.append(node.getValue());
40+
41+
StringBuilder paddingBuilder = new StringBuilder(padding);
42+
if (hasRightSibling) {
43+
paddingBuilder.append("│ ");
44+
} else {
45+
paddingBuilder.append(" ");
46+
}
47+
48+
String paddingForBoth = paddingBuilder.toString();
49+
String pointerRight = "└──";
50+
String pointerLeft = (node.getRight() != null) ? "├──" : "└──";
51+
52+
traverseNodes(sb, paddingForBoth, pointerLeft, node.getLeft(), node.getRight() != null);
53+
traverseNodes(sb, paddingForBoth, pointerRight, node.getRight(), false);
54+
55+
}
56+
57+
}
58+
59+
public void print(PrintStream os) {
60+
os.print(traversePreOrder(tree));
61+
}
62+
63+
}
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
package com.baeldung.printbinarytree;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.io.ByteArrayOutputStream;
6+
import java.io.OutputStream;
7+
import java.io.PrintStream;
8+
9+
import org.junit.After;
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
13+
import com.baeldung.printbinarytree.BinaryTreeModel;
14+
import com.baeldung.printbinarytree.BinaryTreePrinter;
15+
16+
public class PrintingBinaryTreeModelUnitTest {
17+
18+
private BinaryTreeModel balanced;
19+
private BinaryTreeModel leftSkewed;
20+
private BinaryTreeModel rightSkewed;
21+
22+
private OutputStream output;
23+
24+
@Before
25+
public void setup() {
26+
balanced = createBalancedTree();
27+
leftSkewed = createLeftUnbalancedTree();
28+
rightSkewed = createRightUnbalancedTree();
29+
30+
output = new ByteArrayOutputStream();
31+
System.setOut(new PrintStream(output));
32+
}
33+
34+
@After
35+
public void tearDown() {
36+
System.setOut(System.out);
37+
}
38+
39+
private BinaryTreeModel createBalancedTree() {
40+
41+
BinaryTreeModel root = new BinaryTreeModel("root");
42+
43+
BinaryTreeModel node1 = new BinaryTreeModel("node1");
44+
BinaryTreeModel node2 = new BinaryTreeModel("node2");
45+
root.setLeft(node1);
46+
root.setRight(node2);
47+
48+
BinaryTreeModel node3 = new BinaryTreeModel("node3");
49+
BinaryTreeModel node4 = new BinaryTreeModel("node4");
50+
node1.setLeft(node3);
51+
node1.setRight(node4);
52+
53+
node2.setLeft(new BinaryTreeModel("node5"));
54+
node2.setRight(new BinaryTreeModel("node6"));
55+
56+
BinaryTreeModel node7 = new BinaryTreeModel("node7");
57+
node3.setLeft(node7);
58+
node7.setLeft(new BinaryTreeModel("node8"));
59+
node7.setRight(new BinaryTreeModel("node9"));
60+
61+
return root;
62+
}
63+
64+
private BinaryTreeModel createLeftUnbalancedTree() {
65+
66+
BinaryTreeModel root = new BinaryTreeModel("root");
67+
68+
BinaryTreeModel node1 = new BinaryTreeModel("node1");
69+
root.setLeft(node1);
70+
root.setRight(new BinaryTreeModel("node2"));
71+
72+
BinaryTreeModel node3 = new BinaryTreeModel("node3");
73+
node1.setLeft(node3);
74+
75+
BinaryTreeModel node4 = new BinaryTreeModel("node4");
76+
node3.setLeft(node4);
77+
78+
BinaryTreeModel node5 = new BinaryTreeModel("node5");
79+
node4.setLeft(node5);
80+
81+
BinaryTreeModel node6 = new BinaryTreeModel("node6");
82+
node5.setLeft(node6);
83+
84+
BinaryTreeModel node7 = new BinaryTreeModel("node7");
85+
node6.setLeft(node7);
86+
87+
node7.setLeft(new BinaryTreeModel("node8"));
88+
89+
return root;
90+
}
91+
92+
private BinaryTreeModel createRightUnbalancedTree() {
93+
94+
BinaryTreeModel root = new BinaryTreeModel("root");
95+
96+
BinaryTreeModel node2 = new BinaryTreeModel("node2");
97+
root.setLeft(new BinaryTreeModel("node1"));
98+
root.setRight(node2);
99+
100+
BinaryTreeModel node3 = new BinaryTreeModel("node3");
101+
node2.setRight(node3);
102+
103+
BinaryTreeModel node4 = new BinaryTreeModel("node4");
104+
node3.setRight(node4);
105+
106+
BinaryTreeModel node5 = new BinaryTreeModel("node5");
107+
node4.setRight(node5);
108+
109+
BinaryTreeModel node6 = new BinaryTreeModel("node6");
110+
node5.setRight(node6);
111+
112+
BinaryTreeModel node7 = new BinaryTreeModel("node7");
113+
node6.setRight(node7);
114+
115+
node7.setRight(new BinaryTreeModel("node8"));
116+
117+
return root;
118+
}
119+
120+
@Test
121+
public void givenBinaryTreeModelBalanced_whenPrintWithBinaryTreePrinter_thenProduceCorrectOutput() {
122+
123+
StringBuilder expected = new StringBuilder();
124+
expected.append("root").append("\n");
125+
expected.append("├──node1").append("\n");
126+
expected.append("│ ├──node3").append("\n");
127+
expected.append("│ │ └──node7").append("\n");
128+
expected.append("│ │ ├──node8").append("\n");
129+
expected.append("│ │ └──node9").append("\n");
130+
expected.append("│ └──node4").append("\n");
131+
expected.append("└──node2").append("\n");
132+
expected.append(" ├──node5").append("\n");
133+
expected.append(" └──node6");
134+
135+
new BinaryTreePrinter(balanced).print(System.out);
136+
137+
assertEquals(expected.toString(), output.toString());
138+
}
139+
140+
@Test
141+
public void givenBinaryTreeModelLeftUnbalanced_whenPrintWithBinaryTreePrinter_thenProduceCorrectOutput() {
142+
143+
StringBuilder expected = new StringBuilder();
144+
expected.append("root").append("\n");
145+
expected.append("├──node1").append("\n");
146+
expected.append("│ └──node3").append("\n");
147+
expected.append("│ └──node4").append("\n");
148+
expected.append("│ └──node5").append("\n");
149+
expected.append("│ └──node6").append("\n");
150+
expected.append("│ └──node7").append("\n");
151+
expected.append("│ └──node8").append("\n");
152+
expected.append("└──node2");
153+
154+
new BinaryTreePrinter(leftSkewed).print(System.out);
155+
156+
assertEquals(expected.toString(), output.toString());
157+
}
158+
159+
@Test
160+
public void givenBinaryTreeModelRightUnbalanced_whenPrintWithBinaryTreePrinter_thenProduceCorrectOutput() {
161+
162+
StringBuilder expected = new StringBuilder();
163+
expected.append("root").append("\n");
164+
expected.append("├──node1").append("\n");
165+
expected.append("└──node2").append("\n");
166+
expected.append(" └──node3").append("\n");
167+
expected.append(" └──node4").append("\n");
168+
expected.append(" └──node5").append("\n");
169+
expected.append(" └──node6").append("\n");
170+
expected.append(" └──node7").append("\n");
171+
expected.append(" └──node8");
172+
173+
new BinaryTreePrinter(rightSkewed).print(System.out);
174+
175+
assertEquals(expected.toString(), output.toString());
176+
}
177+
178+
}

0 commit comments

Comments
 (0)