ExpressionTree(수식트리)
하나의 연산자가 두 개의 피 연산자를 취한다는 가정아래 두 가지 규칙을 가짐
피연산자는 Left Node
연산자는 root Node or Branch Node
ex) 1 * 2 + (7-8)은 위와 같이 수식트리로 만들 수 있음(후위표기)
알고리즘
- 수식을 뒤에서부터 앞쪽으로 읽어옴
- 수식에서 제일 마지막에 있는 토큰은 루트노드가 된다.
- 후위표기식에서 가장 마지막에 있는 토큰은 항상 연산자이다.
- 수식에서 읽어낸 토큰이 연산자인 경우 가지노드가 되고, 이 토큰 다음에 따라오는 두 개의 토큰은 각각 오른쪽과 왼쪽 자식노드가 된다.
- 다음 토큰에도 연속해서 연산자인 경우 토큰으로부터 만들어지는 하위 트리가 완성된 이후에 읽어낸 토큰이 왼쪽 자식노드가 된다.
- 수식에서 읽어낸 토큰이 숫자이면 Left노드이다.
소스코드
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
| package algorithm;
import java.math.BigDecimal;
public class ExpTree { class Node { private Object data; private Node left; private Node right;
public Node() { data = null; left = null; right = null; }
public Node(Object data) { this.data = data; left = null; right = null; } }
public void expressionTree(StringBuilder postFixExp, Node node) { int len = postFixExp.length(); char token = postFixExp.charAt(len - 1); postFixExp = postFixExp.deleteCharAt(len - 1);
switch (token) { case '+': case '-': case '*': case '/': node = new Node(token); expressionTree(postFixExp, node.right); expressionTree(postFixExp, node.left); break; default: node = new Node(token); break; } }
public double evaluate(Node tree) { double left = 0; double right = 0; double result = 0; if (tree == null) { return 0; } char data = (char) tree.data; System.out.println("char data : " + data); switch (data) { case '+': case '-': case '*': case '/': left = evaluate(tree.left); right = evaluate(tree.right); if (data == '+') { result = left + right; } else if (data == '-') { result = left - right; } else if (data == '*') { result = left * right; } else if (data == '/') { result = new BigDecimal(left).divide(new BigDecimal(right)).doubleValue(); } break; default: result = new BigDecimal((char) tree.data).doubleValue(); break; } return result; }
public void postOrderPrint(Node tree) { if (tree == null) { return; } postOrderPrint(tree.left); postOrderPrint(tree.right); System.out.print(tree.data);
}
public void inOrderPrint(Node tree) { if (tree == null) { return; } System.out.print("("); inOrderPrint(tree.left); System.out.print(tree.data); inOrderPrint(tree.right); System.out.print(")"); } }
|