Skip to content

Commit ec953de

Browse files
authored
Merge pull request #31 from Data-Structure-Study/yoonexample
수식 트리 구현 (4주차 끝)
2 parents f694ae8 + 8336a9b commit ec953de

File tree

3 files changed

+178
-0
lines changed

3 files changed

+178
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package tree.expressiontree;
2+
3+
/**
4+
* 수식 트리 인터페이스
5+
*/
6+
public interface ExpressionTree {
7+
8+
/**
9+
* 트리의 값을 계산합니다.
10+
*
11+
* @return 트리를 가지고 연산한 값
12+
*/
13+
int evaluateTree();
14+
15+
/**
16+
* 전위 표기법으로 표현합니다.
17+
*
18+
* @param sb 표기법이 저장될 공간
19+
*/
20+
void prefixTypeExpression(StringBuilder sb);
21+
22+
/**
23+
* 중위 표기법으로 표현합니다.
24+
*
25+
* @param sb 표기법이 저장될 공간
26+
*/
27+
void infixTypeExpression(StringBuilder sb);
28+
29+
/**
30+
* 후위 표기법으로 표현합니다.
31+
*
32+
* @param sb 표기법이 저장될 공간
33+
*/
34+
void postfixTypeExpression(StringBuilder sb);
35+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package tree.expressiontree;
2+
3+
import stack.ListStack;
4+
import stack.Stack;
5+
import tree.binarytree.TraversableBinaryTreeNode;
6+
import tree.binarytree.TraversableBinaryTreeNodeImpl;
7+
8+
public class ExpressionTreeImpl implements ExpressionTree {
9+
10+
private TraversableBinaryTreeNode<Character> root;
11+
12+
public ExpressionTreeImpl(char[] postfixExpression) {
13+
Stack<TraversableBinaryTreeNode<Character>> stack = new ListStack<>();
14+
15+
for (char expr : postfixExpression) {
16+
TraversableBinaryTreeNode<Character> node = new TraversableBinaryTreeNodeImpl<>(expr);
17+
if (!Character.isDigit(expr)) { // 숫자가 아니라면, 연산자임
18+
node.setRightSubTree(stack.pop());
19+
node.setLeftSubTree(stack.pop());
20+
}
21+
22+
stack.push(node);
23+
}
24+
25+
this.root = stack.pop();
26+
}
27+
28+
@Override
29+
public int evaluateTree() {
30+
return evaluateTree(this.root);
31+
}
32+
33+
private int evaluateTree(TraversableBinaryTreeNode<Character> node) {
34+
TraversableBinaryTreeNode<Character> leftSubTree = node.getLeftSubTree();
35+
TraversableBinaryTreeNode<Character> rightSubTree = node.getRightSubTree();
36+
37+
if (leftSubTree == null && rightSubTree == null) {
38+
return Character.getNumericValue(node.getData()); // 단말 노드는 피연산자임
39+
}
40+
41+
int op1 = 0;
42+
int op2 = 0;
43+
if (leftSubTree != null) {
44+
op1 = evaluateTree(leftSubTree);
45+
}
46+
if (rightSubTree != null) {
47+
op2 = evaluateTree(rightSubTree);
48+
}
49+
50+
switch (node.getData()) {
51+
case '+':
52+
return op1 + op2;
53+
case '-':
54+
return op1 - op2;
55+
case '*':
56+
return op1 * op2;
57+
case '/':
58+
if (op2 == 0) {
59+
throw new ArithmeticException("Can't be division by zero.");
60+
}
61+
return op1 / op2;
62+
}
63+
64+
return 0;
65+
}
66+
67+
@Override
68+
public void prefixTypeExpression(StringBuilder sb) {
69+
this.root.preorderTraverse(sb);
70+
}
71+
72+
@Override
73+
public void infixTypeExpression(StringBuilder sb) {
74+
this.root.inorderTraverse(sb);
75+
}
76+
77+
@Override
78+
public void postfixTypeExpression(StringBuilder sb) {
79+
this.root.postorderTraverse(sb);
80+
}
81+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package tree.expressiontree;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.DisplayName;
7+
import org.junit.jupiter.api.Test;
8+
import stack.InfixToPostfix;
9+
10+
class ExpressionTreeTest {
11+
12+
InfixToPostfix infixToPostfix;
13+
14+
@BeforeEach
15+
void setUp() {
16+
infixToPostfix = new InfixToPostfix();
17+
}
18+
19+
@Test
20+
@DisplayName("수식_트리_테스트")
21+
void 수식_트리_테스트() {
22+
String infixExpression = "1 + 2";
23+
char[] postfixExpression = infixToPostfix.convertInputToPostfix(infixExpression);
24+
25+
ExpressionTree expressionTree = new ExpressionTreeImpl(postfixExpression);
26+
assertThat(expressionTree.evaluateTree()).isEqualTo(3);
27+
28+
StringBuilder sb = new StringBuilder();
29+
expressionTree.prefixTypeExpression(sb);
30+
assertThat(sb.toString()).isEqualTo("+12");
31+
32+
sb = new StringBuilder();
33+
expressionTree.infixTypeExpression(sb);
34+
assertThat(sb.toString()).isEqualTo("1+2");
35+
36+
sb = new StringBuilder();
37+
expressionTree.postfixTypeExpression(sb);
38+
assertThat(sb.toString()).isEqualTo("12+");
39+
}
40+
41+
@Test
42+
@DisplayName("수식_트리_테스트2")
43+
void 수식_트리_테스트2() {
44+
String infixExpression = "1 + 2 * 7";
45+
char[] postfixExpression = infixToPostfix.convertInputToPostfix(infixExpression);
46+
47+
ExpressionTree expressionTree = new ExpressionTreeImpl(postfixExpression);
48+
assertThat(expressionTree.evaluateTree()).isEqualTo(15);
49+
50+
StringBuilder sb = new StringBuilder();
51+
expressionTree.prefixTypeExpression(sb);
52+
assertThat(sb.toString()).isEqualTo("+1*27");
53+
54+
sb = new StringBuilder();
55+
expressionTree.infixTypeExpression(sb);
56+
assertThat(sb.toString()).isEqualTo("1+2*7");
57+
58+
sb = new StringBuilder();
59+
expressionTree.postfixTypeExpression(sb);
60+
assertThat(sb.toString()).isEqualTo("127*+");
61+
}
62+
}

0 commit comments

Comments
 (0)