Skip to content

Commit f694ae8

Browse files
authored
Merge pull request #30 from Data-Structure-Study/yoonexample
순회가 가능한 이진 트리 구현
2 parents 0374180 + 285b939 commit f694ae8

File tree

3 files changed

+232
-0
lines changed

3 files changed

+232
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package tree.binarytree;
2+
3+
/**
4+
* 순회한 정보를 반환할 수 있는 이진 트리
5+
*
6+
* @param <E> 파라미터 타입
7+
*/
8+
public interface TraversableBinaryTreeNode<E> {
9+
10+
/**
11+
* 해당 노드에 저장된 데이터를 반환합니다.
12+
*
13+
* @return 저장된 데이터
14+
*/
15+
E getData();
16+
17+
/**
18+
* 해당 노드의 왼쪽 서브트리를 반환합니다.
19+
*
20+
* @return 왼쪽 서브트리
21+
*/
22+
TraversableBinaryTreeNode<E> getLeftSubTree();
23+
24+
/**
25+
* 왼쪽 서브트리를 등록합니다.
26+
*
27+
* @param subTree 대상이 될 노드
28+
*/
29+
void setLeftSubTree(TraversableBinaryTreeNode<E> subTree);
30+
31+
/**
32+
* 해당 노드의 오른쪽 서브트리를 반환합니다.
33+
*
34+
* @return 오른쪽 서브트리
35+
*/
36+
TraversableBinaryTreeNode<E> getRightSubTree();
37+
38+
/**
39+
* 오른쪽 서브트리를 등록합니다.
40+
*
41+
* @param subTree 대상이 될 노드
42+
*/
43+
void setRightSubTree(TraversableBinaryTreeNode<E> subTree);
44+
45+
/**
46+
* 전위 순회한 정보를 StringBuilder에 저장합니다.
47+
*/
48+
void preorderTraverse(StringBuilder sb);
49+
50+
/**
51+
* 중위 순회한 정보를 StringBuilder에 저장합니다.
52+
*/
53+
void inorderTraverse(StringBuilder sb);
54+
55+
/**
56+
* 후위 순회한 정보를 StringBuilder에 저장합니다.
57+
*/
58+
void postorderTraverse(StringBuilder sb);
59+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package tree.binarytree;
2+
3+
public class TraversableBinaryTreeNodeImpl<E> implements TraversableBinaryTreeNode<E> {
4+
5+
private final E data;
6+
private TraversableBinaryTreeNode<E> left;
7+
private TraversableBinaryTreeNode<E> right;
8+
9+
public TraversableBinaryTreeNodeImpl(E data) {
10+
this.data = data;
11+
}
12+
13+
@Override
14+
public E getData() {
15+
return this.data;
16+
}
17+
18+
@Override
19+
public TraversableBinaryTreeNode<E> getLeftSubTree() {
20+
return this.left;
21+
}
22+
23+
@Override
24+
public void setLeftSubTree(TraversableBinaryTreeNode<E> subTree) {
25+
this.left = subTree;
26+
}
27+
28+
@Override
29+
public TraversableBinaryTreeNode<E> getRightSubTree() {
30+
return this.right;
31+
}
32+
33+
@Override
34+
public void setRightSubTree(TraversableBinaryTreeNode<E> subTree) {
35+
this.right = subTree;
36+
}
37+
38+
@Override
39+
public void preorderTraverse(StringBuilder sb) {
40+
sb.append(this.data.toString());
41+
if (this.left != null) {
42+
this.left.preorderTraverse(sb);
43+
}
44+
if (this.right != null) {
45+
this.right.preorderTraverse(sb);
46+
}
47+
}
48+
49+
@Override
50+
public void inorderTraverse(StringBuilder sb) {
51+
if (this.left != null) {
52+
this.left.inorderTraverse(sb);
53+
}
54+
sb.append(this.data.toString());
55+
if (this.right != null) {
56+
this.right.inorderTraverse(sb);
57+
}
58+
}
59+
60+
@Override
61+
public void postorderTraverse(StringBuilder sb) {
62+
if (this.left != null) {
63+
this.left.postorderTraverse(sb);
64+
}
65+
if (this.right != null) {
66+
this.right.postorderTraverse(sb);
67+
}
68+
sb.append(this.data.toString());
69+
}
70+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package tree.binarytree;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Test;
7+
8+
class TraversableBinaryTreeNodeTest {
9+
10+
@Test
11+
@DisplayName("순회_가능한_이진_트리_생성_및_초기화_테스트")
12+
void 순회_가능한_이진_트리_생성_및_초기화_테스트() {
13+
TraversableBinaryTreeNode<Integer> bt = new TraversableBinaryTreeNodeImpl<>(1);
14+
15+
assertThat(bt).isNotNull();
16+
assertThat(bt.getData()).isEqualTo(1);
17+
assertThat(bt.getLeftSubTree()).isNull();
18+
assertThat(bt.getRightSubTree()).isNull();
19+
}
20+
21+
@Test
22+
@DisplayName("순회_가능한_이진_트리_저장_및_출력_테스트")
23+
void 순회_가능한_이진_트리_저장_및_출력_테스트() {
24+
TraversableBinaryTreeNode<Integer> bt1 = new TraversableBinaryTreeNodeImpl<>(1);
25+
TraversableBinaryTreeNode<Integer> bt2 = new TraversableBinaryTreeNodeImpl<>(2);
26+
TraversableBinaryTreeNode<Integer> bt3 = new TraversableBinaryTreeNodeImpl<>(3);
27+
TraversableBinaryTreeNode<Integer> bt4 = new TraversableBinaryTreeNodeImpl<>(4);
28+
29+
bt1.setLeftSubTree(bt2);
30+
bt1.setRightSubTree(bt3);
31+
bt2.setLeftSubTree(bt4);
32+
33+
assertThat(bt1).isNotNull();
34+
assertThat(bt2).isNotNull();
35+
assertThat(bt3).isNotNull();
36+
assertThat(bt4).isNotNull();
37+
assertThat(bt1.getData()).isEqualTo(1);
38+
assertThat(bt2.getData()).isEqualTo(2);
39+
assertThat(bt3.getData()).isEqualTo(3);
40+
assertThat(bt4.getData()).isEqualTo(4);
41+
assertThat(bt1.getLeftSubTree().getData()).isEqualTo(2);
42+
assertThat(bt1.getRightSubTree().getData()).isEqualTo(3);
43+
assertThat(bt1.getLeftSubTree().getLeftSubTree().getData()).isEqualTo(4);
44+
assertThat(bt1.getLeftSubTree().getRightSubTree()).isNull();
45+
}
46+
47+
@Test
48+
@DisplayName("순회_가능한_이진_트리_전위_순회_테스트")
49+
void 순회_가능한_이진_트리_전위_순회_테스트() {
50+
TraversableBinaryTreeNode<Integer> bt1 = new TraversableBinaryTreeNodeImpl<>(1);
51+
TraversableBinaryTreeNode<Integer> bt2 = new TraversableBinaryTreeNodeImpl<>(2);
52+
TraversableBinaryTreeNode<Integer> bt3 = new TraversableBinaryTreeNodeImpl<>(3);
53+
TraversableBinaryTreeNode<Integer> bt4 = new TraversableBinaryTreeNodeImpl<>(4);
54+
55+
bt1.setLeftSubTree(bt2);
56+
bt1.setRightSubTree(bt3);
57+
bt2.setLeftSubTree(bt4);
58+
59+
String expected = "1243";
60+
StringBuilder sb = new StringBuilder();
61+
bt1.preorderTraverse(sb);
62+
63+
assertThat(sb.toString()).isEqualTo(expected);
64+
}
65+
66+
@Test
67+
@DisplayName("순회_가능한_이진_트리_중위_순회_테스트")
68+
void 순회_가능한_이진_트리_중위_순회_테스트() {
69+
TraversableBinaryTreeNode<Integer> bt1 = new TraversableBinaryTreeNodeImpl<>(1);
70+
TraversableBinaryTreeNode<Integer> bt2 = new TraversableBinaryTreeNodeImpl<>(2);
71+
TraversableBinaryTreeNode<Integer> bt3 = new TraversableBinaryTreeNodeImpl<>(3);
72+
TraversableBinaryTreeNode<Integer> bt4 = new TraversableBinaryTreeNodeImpl<>(4);
73+
74+
bt1.setLeftSubTree(bt2);
75+
bt1.setRightSubTree(bt3);
76+
bt2.setLeftSubTree(bt4);
77+
78+
String expected = "4213";
79+
StringBuilder sb = new StringBuilder();
80+
bt1.inorderTraverse(sb);
81+
82+
assertThat(sb.toString()).isEqualTo(expected);
83+
}
84+
85+
@Test
86+
@DisplayName("순회_가능한_이진_트리_후위_순회_테스트")
87+
void 순회_가능한_이진_트리_후위_순회_테스트() {
88+
TraversableBinaryTreeNode<Integer> bt1 = new TraversableBinaryTreeNodeImpl<>(1);
89+
TraversableBinaryTreeNode<Integer> bt2 = new TraversableBinaryTreeNodeImpl<>(2);
90+
TraversableBinaryTreeNode<Integer> bt3 = new TraversableBinaryTreeNodeImpl<>(3);
91+
TraversableBinaryTreeNode<Integer> bt4 = new TraversableBinaryTreeNodeImpl<>(4);
92+
93+
bt1.setLeftSubTree(bt2);
94+
bt1.setRightSubTree(bt3);
95+
bt2.setLeftSubTree(bt4);
96+
97+
String expected = "4231";
98+
StringBuilder sb = new StringBuilder();
99+
bt1.postorderTraverse(sb);
100+
101+
assertThat(sb.toString()).isEqualTo(expected);
102+
}
103+
}

0 commit comments

Comments
 (0)