이 문제에서는 +, - , /, *와 같은 이진 연산으로 구성된 표현식 트리가 제공됩니다. 표현식 트리를 평가한 다음 결과를 반환해야 합니다.
표현식 트리 각 노드가 다음과 같이 배포되는 연산자 또는 피연산자로 구성되는 특수한 유형의 이진 트리입니다.
- 트리의 리프 노드는 작업을 수행할 값입니다.
- 리프가 아닌 노드는 이항 연산자로 구성됨 수행할 작업을 나타냅니다.
문제를 이해하기 위해 예를 들어 보겠습니다.
입력:
<강한>
출력: 1
설명:
표현식 트리 디코딩,
경험치 =( (5+9) / (2*7) )
=( 14 / 14 )
=1
해결 방법:
문제에 대한 간단한 해결책은 루트에서 각각 하나의 연산을 수행하는 것입니다. 피연산자의 경우 하위 트리를 해결할 것입니다. 모든 작업은 이진법이므로 트리의 노드에는 두 개의 자식이 있거나 전혀 없습니다.
재귀를 사용하여 각 노드의 이진 연산을 해결합니다.
우리 솔루션의 작동을 설명하는 프로그램,
예시
#include <bits/stdc++.h>
using namespace std;
class node {
public:
string value;
node *left = NULL, *right = NULL;
node(string x)
{
value = x;
}
};
int solveExpressionTree(node* root) {
if (!root)
return 0;
if (!root->left && !root->right)
return stoi(root->value);
int leftSubTreeSol = solveExpressionTree(root->left);
int rightSubTreeSol = solveExpressionTree(root->right);
if (root->value == "+")
return leftSubTreeSol + rightSubTreeSol;
if (root->value == "-")
return leftSubTreeSol - rightSubTreeSol;
if (root->value == "*")
return leftSubTreeSol * rightSubTreeSol;
if (root -> value == "/")
return leftSubTreeSol / rightSubTreeSol;
return -1;
}
int main()
{
node *root = new node("/");
root->left = new node("+");
root->left->left = new node("9");
root->left->right = new node("5");
root->right = new node("*");
root->right->left = new node("2");
root->right->right = new node("7");
cout<<"The evaluation of expression tree is "<<solveExpressionTree(root);
return 0;
} 출력 -
The evaluation of expression tree is 1