neongm

Untitled

Dec 30th, 2020
855
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.41 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. class elem{                             // класс узла
  4. public:
  5.     int m_data;
  6.     elem* m_left;
  7.     elem* m_right;
  8.     elem(int val){
  9.         m_left = NULL;
  10.         m_right = NULL;
  11.         m_data = val;
  12.     }
  13. };
  14.  
  15. class binary_tree{                      // класс дерева
  16. public:
  17.     binary_tree(int);
  18.     ~binary_tree();
  19.     void print();
  20.     bool find(int);
  21.     void insert(int);
  22.     void erase(int);
  23.     int size() { return m_size; }
  24. private:
  25.     elem* m_root;
  26.     int m_size;
  27.     void print_tree(elem*, int);
  28.     void delete_tree(elem*);
  29.  
  30. };
  31.  
  32. binary_tree::binary_tree(int key)                        // конструктор
  33. {
  34.     m_root = new elem(key);
  35.     m_size = 1;
  36. }
  37.  
  38. binary_tree::~binary_tree(){                              // деструктор
  39.     delete_tree(m_root);
  40. }
  41. void binary_tree::delete_tree(elem* curr){
  42.     if (curr){
  43.         delete_tree(curr->m_left);
  44.         delete_tree(curr->m_right);
  45.         delete curr;
  46.     }
  47. }
  48.  
  49. void binary_tree::print(){                                 // вывод
  50.     print_tree(m_root, 0);
  51.     std::cout <<'\n';
  52. }
  53.  
  54. void binary_tree::print_tree(elem* p, int lvl){
  55.     if (p){
  56.         print_tree(p->m_left, lvl + 1);
  57.         for (int i = 0; i < lvl; i++) std::cout << "   ";
  58.         std::cout << p->m_data << std::endl;
  59.         print_tree(p->m_right, lvl + 1);
  60.     }
  61. }
  62.  
  63. void binary_tree::insert(int key){                         // добавление
  64.     elem* curr = m_root;
  65.     while (curr && curr->m_data != key){
  66.         if (curr->m_data > key && curr->m_left == NULL){
  67.             curr->m_left = new elem(key);
  68.             ++m_size;
  69.             return;
  70.         }
  71.         if (curr->m_data < key && curr->m_right == NULL){
  72.             curr->m_right = new elem(key);
  73.             ++m_size;
  74.             return;
  75.         }
  76.         if (curr->m_data > key) curr = curr->m_left;
  77.         else curr = curr->m_right;
  78.     }
  79. }
  80.  
  81. bool binary_tree::find(int key){                              // поиск
  82.     elem* curr = m_root;
  83.     while (curr && curr->m_data != key){
  84.         if (curr->m_data > key) curr = curr->m_left;
  85.         else curr = curr->m_right;
  86.     }
  87.     return curr != NULL;
  88. }
  89.  
  90. void binary_tree::erase(int key){
  91.     elem* curr = m_root;
  92.     elem* parent = NULL;
  93.     while (curr && curr->m_data != key){
  94.         parent = curr;
  95.         if (curr->m_data > key){
  96.             curr = curr->m_left;
  97.         }else {
  98.             curr = curr->m_right;
  99.         }
  100.     }
  101.     if (!curr) return;
  102.     if (curr->m_left == NULL){
  103.         if (parent && parent->m_left == curr) parent->m_left = curr->m_right;
  104.         if (parent && parent->m_right == curr) parent->m_right = curr->m_right;
  105.         --m_size;
  106.         delete curr;
  107.         return;
  108.     }
  109.     if (curr->m_right == NULL){
  110.         if (parent && parent->m_left == curr) parent->m_left = curr->m_left;
  111.         if (parent && parent->m_right == curr) parent->m_right = curr->m_left;
  112.         --m_size;
  113.         delete curr;
  114.         return;
  115.     }
  116.     elem* replace = curr->m_right;
  117.     while (replace->m_left) replace = replace->m_left;
  118.     int replace_value = replace->m_data;
  119.     erase(replace_value);
  120.     curr->m_data = replace_value;
  121. }
  122.  
  123. int main(){
  124.     setlocale(LC_ALL, "russian");
  125.     int val;
  126.     std::cout << "введите значение корневого узла дерева:\n>";
  127.     std::cin >> val;
  128.     binary_tree tr(val);
  129.     int choice;
  130.    
  131.  
  132.     while (true) {
  133.         std::cout << "введите:\n1 - для добавления узлов в дерево\n2 - для удаления узла из дерева\n3 - для поиска узла в дереве\n4 - для вывода дерева\n0 - для выхода из программы\n>";
  134.        
  135.         std::cin >> choice;
  136.         if (choice == 1) {
  137.             if (tr.size() == 0) {
  138.                 std::cout << "введите значение корневого узла дерева:\n>";
  139.                 std::cin >> val;
  140.                 binary_tree tr(val);
  141.             }
  142.             std::cout << "введите значения узлов через пробел, -1 для конца ввода:\n>";
  143.             int temp;
  144.             while (true) {
  145.                 std::cin >> temp;
  146.                 if (temp != -1)  tr.insert(temp);
  147.                 else break;
  148.             }
  149.             std::cout << "\n";
  150.         }
  151.         else if (choice == 2) {
  152.             int temp;
  153.             std::cout << "введите узел для удаления:\n>";
  154.             std::cin >> temp;
  155.             if (tr.find(temp)) tr.erase(temp);
  156.             else std::cout << "такого узла нет\n";
  157.             std::cout << "\n";
  158.         }
  159.         else if (choice == 3) {
  160.             int temp;
  161.             std::cout << "введите узел для поиска:\n>";
  162.             std::cin >> temp;
  163.             if (tr.find(temp)) std::cout << "узел " << temp << " найден\n";
  164.             else std::cout << "узел " << temp << " не найден\n";
  165.             std::cout << "\n";
  166.         }
  167.         else if (choice == 4) {
  168.             if (tr.size() == 0) std::cout << "в дереве нет элементов\n";
  169.             else tr.print();
  170.             std::cout << "\n";
  171.         }
  172.         else if (choice == 0) {
  173.             return 0;
  174.         }
  175.         else std::cout << "некоректный ввод\n\n";
  176.     }
  177. }
  178.  
Advertisement
Add Comment
Please, Sign In to add comment