Дерево‐формула - EcsFlash/DataTypes GitHub Wiki

Исходный код - тут

Все вопросы к нему, он это исправлял

Формула дерева

Как с ним работать:

ifstream in("hello.txt");
TreeNode* root = createFormula(in);
cout << printToStr(root) << endl;
cout << culcFormula(root) << endl;

в исходном выражении везде должны быть не числа, а цифры, к тому же везде выставлены скобки, как на фото image

Структура дерева

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;
    }
}