수식 트리 

 

수식을 표현하는 이진트리 입니다. 

 

수식트리는 아래의 두 가지 규칙을 따릅니다.

 

피연산자는 잎노드 이다. 

연산자는 루트노드 또는 가지노드이다.  

 

 

수식 트리 만들기 - Build() 함수 

 

연산자의 경우, 토큰으로 새 노드를 생성하여 연결합니다.

그리고 Build() 함수를 재귀호출 하여 다음에 오는 노드 두개를 새 노드의 자식으로 연결합니다. 

 

피연산자의 경우, 토큰으로 새 노드를 생성합니다. 

 

// 수식 트리 구축하기 
void BuildTree(char* postfixExp, Node** node) {

	// 맨 뒤 부터 하나씩 토큰을 읽는다. 
	int len = strlen(postfixExp);
	char token = postfixExp[len - 1];
	postfixExp[len-1] = '\0';

	switch (token) {
		//연산자라면, 2번 BuildTree 재귀호출.
	case '+': case '-': case '*': case '/':
		(*node) = CreateNode(token); //노드에 연결 
		BuildTree(postfixExp, &(*node)->right); // 식을 '뒤부터'읽으니까 오른쪽부터.
		BuildTree(postfixExp, &(*node)->left);
		break;
		
	default: //피연산자라면 노드 생성 
		(*node) = CreateNode(token);
		break;
	}
}

 

 

수식 트리 계산하기 - Calculate() 함수

 

연산자인 경우, 두 자식의 아래 노드들의 연산 결과가 먼저 필요하므로,

두 자식을 파라미터로 넘겨서 Calculate() 함수를 재귀 호출합니다.

  

피연산자인 경우, 토큰에 담겨있던 수를 double형으로 변환하여 반환합니다. 

 

double Calculate(Node* tree) {
	
	double left, right, result = 0;
	char tempChar[2];

	if (tree == NULL) {
		return 0;
	}

	switch (tree->data) {
		case '+': case '-': case '*': case '/':
			left = Calculate(tree->left);
			right = Calculate(tree->right);

			if (tree->data == '+') { 
				result = left + right; 
			}
			else if (tree->data == '-') {
				result = left - right;
			}
			else if (tree->data == '*') {
				result = left * right;
			}
			else if (tree->data == '/') {
				result = left / right;
			}
			break;
		default: //피연산자인 경우,
			memset(tempChar, 0, sizeof(tempChar));
			tempChar[0] = tree->data;
			result = atof(tempChar);
			break;
	}

	return result;
}

 

728x90

'알고리즘 > 알고리즘 C' 카테고리의 다른 글

이진 탐색  (0) 2020.03.18
분리 집합 (유니온파인드) c++  (0) 2020.03.18
이진 트리  (0) 2020.03.11
트리 기초  (0) 2020.03.11
링크드 큐  (0) 2020.03.10

+ Recent posts