Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.30 KB | None | 0 0
  1. #pragma once
  2. using namespace std;
  3.  
  4. struct elem {
  5.     int value;
  6.     elem *left, *right;
  7. };
  8.  
  9. class searchTree {
  10. private:
  11.     elem *tree;
  12.     int counter = 0;
  13. public:
  14.     searchTree() {
  15.         tree = nullptr;
  16.     }
  17.     ~searchTree() {
  18.         delete_helper(tree);
  19.     }
  20.    
  21.     void delete_helper(elem *tree) {
  22.         if (tree != nullptr) {
  23.             delete_helper(tree->left);
  24.             delete_helper(tree->right);
  25.             delete tree;
  26.         }
  27.     }
  28.    
  29.     void show_pre() {
  30.         show_pre_helper(tree);
  31.     }
  32.    
  33.     void show_pre_helper(elem *tree) {
  34.         if (tree) {
  35.             cout << tree -> value << endl;
  36.             show_pre_helper(tree->left);
  37.             show_pre_helper(tree->right);
  38.         }
  39.     }
  40.    
  41.     void show_in() {
  42.         show_in_helper(tree);
  43.     }
  44.    
  45.     void show_in_helper(elem *tree) {
  46.         if (tree) {
  47.             show_in_helper(tree->left);
  48.             cout << tree -> value << endl;
  49.             show_in_helper(tree->right);
  50.         }
  51.     }
  52.    
  53.     void show_post() {
  54.         show_post_helper(tree);
  55.     }
  56.    
  57.     void show_post_helper(elem *tree) {
  58.         if (tree) {
  59.             show_post_helper(tree->left);
  60.             show_post_helper(tree->right);
  61.             cout << tree -> value << endl;
  62.         }
  63.     }
  64.    
  65.     int min() {
  66.         cout << min_helper(tree) << endl;
  67.         return min_helper(tree);
  68.     }
  69.    
  70.     int min_helper(elem *tree) {
  71.         while (tree->left != nullptr)
  72.             tree = tree -> left;
  73.         return tree -> value;
  74.     }
  75.    
  76.     int max() {
  77.         cout << max_helper(tree) << endl;
  78.         return max_helper(tree);
  79.     }
  80.    
  81.     int max_helper(elem *tree) {
  82.         while (tree->right != nullptr)
  83.             tree = tree -> right;
  84.         return tree -> value;
  85.     }
  86.    
  87.     void add(int x) {
  88.         add_helper(x, tree);
  89.     }
  90.    
  91.     void add_helper(int x, elem *&tree) {
  92.         if (tree == nullptr) {
  93.             tree = new elem;
  94.             tree -> value = x;
  95.             tree -> left = tree -> right = nullptr;
  96.         }
  97.         if (x < tree -> value) {
  98.             add_helper (x, tree -> left);
  99.         }
  100.         if (x > tree -> value) {
  101.             add_helper (x, tree -> right);
  102.         }
  103.     }
  104.    
  105.     void remove(int x) {
  106.         remove_helper(x, tree);
  107.     }
  108.    
  109.     void remove_helper(int x, elem *&tree) {
  110.         if (tree -> value == x) {
  111.             elem *node = tree;
  112.             if (tree -> left == nullptr && tree -> right == nullptr) {
  113.                 tree = 0;
  114.                 delete node;
  115.             }
  116.             else {
  117.                 if (tree -> left == nullptr) {
  118.                     tree = tree -> right;
  119.                     delete node;
  120.                 }
  121.                 else {
  122.                     if (tree -> right == nullptr) {
  123.                         tree = tree -> left;
  124.                         delete node;
  125.                     }
  126.                     else {
  127.                         elem *p = tree;
  128.                         elem *i = tree -> left;
  129.                         int count = 0;
  130.                         while (i -> right != nullptr)
  131.                         {
  132.                             p = i;
  133.                             i = i -> right;
  134.                             count++;
  135.                         }
  136.                         tree->value = i->value;
  137.                         if (count)
  138.                             p -> right = i -> left;
  139.                         else
  140.                             p -> left = i -> left;
  141.                         delete_helper(i);
  142.                     }
  143.                 }
  144.             }
  145.         }
  146.         else {
  147.             if (x < tree -> value)
  148.                 remove_helper(x, tree->left);
  149.             else
  150.                 remove_helper(x, tree->right);
  151.         }
  152.     }
  153. };
  154.  
  155.  
  156.  
  157. int main() {
  158.     searchTree tree;
  159.     int elems = 0, choice = 0, show = 0, del = 0;
  160.     char exit = 0;
  161.     do {
  162.         cout<<"1. Добавить узел в дерево"<<endl
  163.         <<"2. Обойти дерево"<<endl
  164.         <<"3. Удалить узел дерева"<<endl
  165.         <<"4. Вывести минимальное значение дерева"<<endl
  166.         <<"5. Вывести максимальное значение дерева"<<endl
  167.         <<"0. Завершить программу"<<endl
  168.         <<"Выберите один из пунктов: ";
  169.         cin >> choice;
  170.         switch (choice) {
  171.             case 0:
  172.                 return 0;
  173.  
  174.             case 1:
  175.                 cout << "Введите количество элементов, которое вы хотите добавить в дерево: ";
  176.                 cin >> elems;
  177.                 cout << "Вводите " << elems << " элементов: ";
  178.                 for (int i = 0, m; i < elems; i++) {
  179.                     cin >> m;
  180.                     tree.add(m);
  181.                 }
  182.                 break;
  183.  
  184.             case 2:
  185.                 cout<<"Выберите обход: "<<endl
  186.                 <<"1. Префиксный"<<endl
  187.                 <<"2. Инфиксный"<<endl
  188.                 <<"3. Постфиксный"<<endl;
  189.                 cin >> show;
  190.                 switch (show) {
  191.                     case 1:
  192.                         tree.show_pre();
  193.                         break;
  194.                     case 2:
  195.                         tree.show_in();
  196.                         break;
  197.                     case 3:
  198.                         tree.show_post();
  199.                         break;
  200.                 }
  201.                 break;
  202.  
  203.             case 3:
  204.                 cout << "Введите значение удаляемого узла: ";
  205.                 cin >> del;
  206.                 tree.remove(del);
  207.                 cout << "Ваше дерево без элемента " << del << endl;
  208.                 tree.show_in();
  209.                 break;
  210.  
  211.             case 4:
  212.                 tree.min();
  213.                 break;
  214.  
  215.             case 5:
  216.                 tree.max();
  217.                 break;
  218.  
  219.             default:
  220.                 cout << "Такого пункта нет!" << endl;
  221.         }
  222.         cout<<"Вы хотите выбрать еще какой-либо пункт? (Y/N)"<<endl;
  223.         cin >> exit;
  224.     } while (exit == 'y');
  225.  
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement