일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- spring boot
- 코딩테스트
- 알고리즘
- 가상면접사례로배우는대규모시스템설계기초
- OpenCV
- 카카오 코테
- TypeORM
- 파이썬
- 코테
- @Autowired
- 시스템호출
- AWS
- 카카오
- thymeleaf
- nestjs auth
- @Component
- nestJS
- 프로그래머스
- 컴포넌트스캔
- C언어
- 카카오 알고리즘
- 스프링
- 구조체배열
- Nodejs
- 해시
- Spring
- git
- C++
- python
- nestjs typeorm
Archives
- Today
- Total
공부 기록장 💻
[자료구조] 수식 트리 계산 프로그램 본문
이진 트리는 수식 트리(expression tree)를 처리하는데 사용될 수 있다.
수식 트리는 기본적으로 연산자(+, -, *, / 등)와 피연산자(정수, 실수 등)으로 만들어진다.
피연산자들은 단말노드가 되며 연산자는 비단말 노드가 된다.
스택을 이용한 후위 표기 수식을 떠올려보자.
피연산자이면 스택에 삽입하고, 연산자이면 스택에서 필요한 수만큼의 피연산자를 꺼내 연산을 실행하고,
그 연산 결과를 다시 스택에 넣는 방법이었다.
이번에는 후위 표기 수식이 아닌, '수식 트리'의 구조로 수식이 표현된다.
수식 트리의 루트 노드는 연산자이고, 연산자의 피연산자인 자식 노드들을 계산하여 전체 수식을 계산해보자.
루트 노드보다 자식 노드들을 먼저 방문하는 후위 순회 방법을 사용하여 계산을 진행해보자.
/* * 수식 트리 계산 프로그램 */ #include <stdio.h> #include <stdlib.h> // 이진 트리 노드 구조체 typedef struct TreeNode { int data; struct TreeNode* left, * right; }TreeNode; // + // * + // 1 4 16 25 // // (1*4) + (16+25) TreeNode n1 = { 1, NULL, NULL }; TreeNode n2 = { 4, NULL, NULL }; TreeNode n3 = { '*', &n1, &n2 }; TreeNode n4 = { 16, NULL, NULL }; TreeNode n5 = { 25, NULL, NULL}; TreeNode n6 = { '+', &n4, &n5 }; TreeNode n7 = { '+', &n3, &n6 }; TreeNode* exp = &n7; // 수식 계산 함수 int evaluate(TreeNode* root) { int op1, op2; if (root == NULL) return 0; if (root->left == NULL && root->right == NULL) return root->data; else { op1 = evaluate(root->left); op2 = evaluate(root->right); printf("%d %c %d 을 계산합니다. \n", op1, root->data, op2); switch (root->data) { case '+': return op1 + op2; case '-': return op1 - op2; case '*': return op1 * op2; case '/': return op1 / op2; } } return 0; } int main() { printf("수식의 값은 %d입니다. \n", evaluate(exp)); }
// + // * + // 1 4 / 25 // 6 3 // (1*4) + (6 / 3) + 25 = 4 + 2 + 25 = 31 TreeNode n1 = { 1, NULL, NULL }; TreeNode n2 = { 4, NULL, NULL }; TreeNode n3 = { '*', &n1, &n2 }; TreeNode n4 = { 6, NULL, NULL }; TreeNode n5 = { 3, NULL, NULL}; TreeNode n6 = { '/', &n4, &n5 }; TreeNode n7 = { 25, NULL, NULL }; TreeNode n8 = { '+', &n6, &n7 }; TreeNode n9 = { '+', &n3, &n8 }; TreeNode* exp = &n9;
728x90
반응형
'# CS Study > DS Algorithm' 카테고리의 다른 글
[자료구조] 스레드 이진 트리(Threaded Binary Tree) (0) | 2021.09.26 |
---|---|
[자료구조] 이진 트리의 노드, 단말 노드 개수, 높이 구하기 연산 (0) | 2021.09.26 |
[자료구조] 이진 트리의 레벨 순회(level_order) (0) | 2021.09.23 |
[자료구조] 이진 트리(Binary Tree)의 구조와 전위, 중위, 후위 순환/반복 순회 (0) | 2021.09.23 |
[자료구조] 스택 / 큐 / 연결리스트 정리 (0) | 2021.06.07 |
Comments