Advertisement
DaniDori

4 remake

Nov 27th, 2023
651
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <string>
  4. #include <stack>
  5. using namespace std;
  6. class TreeNode {
  7. public:
  8.     char value;  // символьное значение узла
  9.     TreeNode* left;  // указатель на левое поддерево
  10.     TreeNode* right;  // указатель на правое поддерево
  11.  
  12.     TreeNode(char v) : value(v), left(nullptr), right(nullptr) {}
  13. };
  14.  
  15. class ExpressionTree {
  16. private:
  17.     TreeNode* root;
  18.  
  19.     TreeNode* parseExpression(const string& expr, int start, int end) {
  20.         if (start > end) {
  21.             return nullptr;
  22.         }
  23.  
  24.         // Поиск операции с наименьшим приоритетом
  25.         for (int i = end; i >= start; i--) {
  26.             if (expr[i] == '+' || expr[i] == '-') {
  27.                 TreeNode* node = new TreeNode(expr[i]);
  28.                 node->left = parseExpression(expr, start, i - 1);
  29.                 node->right = parseExpression(expr, i + 1, end);
  30.                 return node;
  31.             }
  32.         }
  33.  
  34.         // Поиск операции с более высоким приоритетом
  35.         for (int i = end; i >= start; i--) {
  36.             if (expr[i] == '*' || expr[i] == '/') {
  37.                 TreeNode* node = new TreeNode(expr[i]);
  38.                 node->left = parseExpression(expr, start, i - 1);
  39.                 node->right = parseExpression(expr, i + 1, end);
  40.                 return node;
  41.             }
  42.         }
  43.  
  44.         // Если операция не найдена, это число
  45.         return new TreeNode(expr[start]);
  46.     }
  47.  
  48. public:
  49.     ExpressionTree() : root(nullptr) {}
  50.  
  51.     void buildFromExpression(const string& expr) {
  52.         root = parseExpression(expr, 0, expr.length() - 1);
  53.     }
  54.  
  55.     void display() {
  56.         displayTree(root);
  57.     }
  58.  
  59.     void simplify() {
  60.         root = simplifyTree(root);
  61.     }
  62.  
  63.     void breadthFirstDisplay() {
  64.         breadthFirstTraversal(root);
  65.         cout << endl;
  66.     }
  67.  
  68.     void displayTree(TreeNode* node, int level = 0) {
  69.         if (!node) {
  70.             return;
  71.         }
  72.  
  73.         displayTree(node->right, level + 1);
  74.         for (int i = 0; i < level; i++) {
  75.             cout << "    ";
  76.         }
  77.         cout << node->value << endl;
  78.         displayTree(node->left, level + 1);
  79.     }
  80.  
  81.     TreeNode* simplifyTree(TreeNode* node) {
  82.         if (!node) {
  83.             return nullptr;
  84.         }
  85.  
  86.         node->left = simplifyTree(node->left);
  87.         node->right = simplifyTree(node->right);
  88.  
  89.         if (node->value == '+') {
  90.             if (node->left && node->left->value == '0') {
  91.                 TreeNode* temp = node->right;
  92.                 delete node;
  93.                 return temp;
  94.             }
  95.             if (node->right && node->right->value == '0') {
  96.                 TreeNode* temp = node->left;
  97.                 delete node;
  98.                 return temp;
  99.             }
  100.         }
  101.         else if (node->value == '-') {
  102.             if (node->right && node->right->value == '0') {
  103.                 TreeNode* temp = node->left;
  104.                 delete node;
  105.                 return temp;
  106.             }
  107.         }
  108.         else if (node->value == '*') {
  109.             if (node->left && node->left->value == '1') {
  110.                 TreeNode* temp = node->right;
  111.                 delete node;
  112.                 return temp;
  113.             }
  114.             if (node->right && node->right->value == '1') {
  115.                 TreeNode* temp = node->left;
  116.                 delete node;
  117.                 return temp;
  118.             }
  119.             if ((node->left && node->left->value == '0') || (node->right && node->right->value == '0')) {
  120.                 delete node;
  121.                 return new TreeNode('0');
  122.             }
  123.         }
  124.  
  125.         return node;
  126.     }
  127.  
  128.     void breadthFirstTraversal(TreeNode* node) {
  129.         if (!node) {
  130.             return;
  131.         }
  132.  
  133.         queue<TreeNode*> q;
  134.         q.push(node);
  135.  
  136.         while (!q.empty()) {
  137.             TreeNode* current = q.front();
  138.             q.pop();
  139.  
  140.             cout << current->value << " ";
  141.  
  142.             if (current->left) {
  143.                 q.push(current->left);
  144.             }
  145.             if (current->right) {
  146.                 q.push(current->right);
  147.             }
  148.         }
  149.     }
  150. };
  151.  
  152. int main() {
  153.     setlocale(LC_ALL, "Russian");
  154.  
  155.     cout << "Тест 1: Создание дерева из выражения '5'" << endl;
  156.     ExpressionTree tree1;
  157.     tree1.buildFromExpression("5");
  158.     tree1.display();
  159.     cout << "---------------\n";
  160.  
  161.     cout << "Тест 2: Упрощение дерева выражения '1+0'" << endl;
  162.     ExpressionTree tree2;
  163.     tree2.buildFromExpression("1+0");
  164.     cout << "Дерево до упрощения:" << endl;
  165.     tree2.display();
  166.     cout << "---------------\n";
  167.  
  168.     tree2.simplify();
  169.  
  170.     cout << "Дерево после упрощения:" << endl;
  171.     tree2.display();
  172.     cout << "---------------\n";
  173.  
  174.     cout << "Тест 3: Обход дерева в ширину для выражения '1+2*3'" << endl;
  175.     ExpressionTree tree3;
  176.     tree3.buildFromExpression("1+2*3");
  177.     tree3.breadthFirstDisplay();
  178.     cout << "---------------\n";
  179.  
  180.     cout << "Тест 4: Упрощение сложного дерева для выражения '1+2*3-0'" << endl;
  181.     ExpressionTree tree4;
  182.     tree4.buildFromExpression("1+2*3-0");
  183.  
  184.     cout << "Дерево до упрощения:" << endl;
  185.     tree4.display();
  186.     cout << "---------------\n";
  187.  
  188.     tree4.simplify();
  189.  
  190.     cout << "Дерево после упрощения:" << endl;
  191.     tree4.display();
  192.     cout << "---------------\n";
  193.  
  194.     cout << "Тест 5: Создание и упрощение дерева с выражением '6/2*3+1-0'" << endl;
  195.     ExpressionTree tree5;
  196.     tree5.buildFromExpression("6/2*3+1-0");
  197.  
  198.     cout << "Дерево до упрощения:" << endl;
  199.     tree5.display();
  200.     cout << "---------------\n";
  201.  
  202.     tree5.simplify();
  203.  
  204.     cout << "Дерево после упрощения:" << endl;
  205.     tree5.display();
  206.     cout << "---------------\n";
  207.  
  208.     return 0;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement