Дерево‐формула - EcsFlash/DataTypes GitHub Wiki
тут
Исходный код -нему, он это исправлял
Все вопросы кФормула дерева
Как с ним работать:
ifstream in("hello.txt");
TreeNode* root = createFormula(in);
cout << printToStr(root) << endl;
cout << culcFormula(root) << endl;
в исходном выражении везде должны быть не числа, а цифры, к тому же везде выставлены скобки, как на фото
Структура дерева
struct TreeNode
{
char data;
TreeNode* left;
TreeNode* right;
};
Конструктор дерева
inline TreeNode* createFormula(ifstream& fin) {
char ch = fin.get();
TreeNode* node = new TreeNode;
if (ch >= '0' && ch <= '9') {
node->data = ch;
node->left = nullptr;
node->right = nullptr;
}
else if (ch == '(') {
node->left = createFormula(fin);
node->data = fin.get();
node->right = createFormula(fin);
ch = fin.get();
}
return node;
}
Рекурсивный вывод результата
inline string printToStr(TreeNode* root) {
if (!root->left && !root->right) {
return string(1, root->data);
}
else {
return '(' + printToStr(root->left) + root->data + printToStr(root->right) + ')';
}
}
Калькулятор для вычисления
inline int culcFormula(TreeNode* root) {
if (!root->left && !root->right) {
return root->data - '0';
}
else {
int leftValue = culcFormula(root->left);
int rightValue = culcFormula(root->right);
switch (root->data) {
case '-': return leftValue - rightValue;
case '+': return leftValue + rightValue;
case '*': return leftValue * rightValue;
case '/': return leftValue / rightValue;
default:
throw invalid_argument("Unknown operator");
}
}
}
Удаление дерева
inline void deleteTree(TreeNode* root) {
if (root) {
deleteTree(root->left);
deleteTree(root->right);
delete root;
root = nullptr;
}
}