Advertisement
Korotkodul

tree6_del

Apr 19th, 2025 (edited)
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. const int inf = 2e9;
  6.  
  7. struct node {
  8.     node* parent;
  9.     node* l;
  10.     node* r;
  11.     int val;
  12.  
  13.     node(node* par) : parent(par), l(nullptr), r(nullptr), val(inf) {}
  14.     node() : parent(nullptr), l(nullptr), r(nullptr), val(inf) {}
  15. };
  16.  
  17. struct tree {
  18.     //vector<int> arr; // используется ТОЛЬКО для инициализации дерева
  19.     node* main_root; // Изменен на указатель для удобства
  20.     int cur_size = 0;
  21.  
  22.     // Создает поддерево
  23.     node* create_subtree(node* par, int Li, int Ri, const vector <int> &arr) {
  24.         if (Li > Ri) return nullptr; // Проверка на правильные границы
  25.  
  26.         node* root = new node(par);
  27.         root->val = arr[(Ri + Li) / 2]; // устанавливаем значение корня
  28.  
  29.         // Создание левого и правого поддеревьев
  30.         root->l = create_subtree(root, Li, (Ri + Li) / 2 - 1, arr);
  31.         root->r = create_subtree(root, (Ri + Li) / 2 + 1, Ri, arr);
  32.  
  33.         return root; // Возвращаем указатель на созданный узел
  34.     }
  35.  
  36.     // Инициализация дерева
  37.     void create(const vector <int> &arr) {
  38.         cur_size = arr.size();
  39.         if (arr.size() == 0) {
  40.             main_root = nullptr; // В случае пустого массива
  41.         } else {
  42.             main_root = create_subtree(nullptr, 0, arr.size() - 1, arr);
  43.         }
  44.         cout << "Tree created\n";
  45.     }
  46.  
  47.     // Обход дерева (in-order)
  48.     void trav(node* root) {
  49.         if (root == nullptr) return; // Проверка на nullptr
  50.         trav(root->l); // Обход левого поддерева
  51.         cout << root->val << " "; // Обработка текущего узла
  52.         trav(root->r); // Обход правого поддерева
  53.     }
  54.  
  55.     void replace_el(node* root, int Li, int Ri, int i, int x) {
  56.         if (root == nullptr) return;
  57.  
  58.         int mid = (Li + Ri) / 2;
  59.         if (i == mid) {  // Нашли узел, который нужно заменить
  60.             root->val = x;
  61.             return;
  62.         }
  63.  
  64.         if (i < mid) {
  65.             replace_el(root->l, Li, mid - 1, i, x);  // Ищем в левом поддереве
  66.         } else {
  67.             replace_el(root->r, mid + 1, Ri, i, x);  // Ищем в правом поддереве
  68.         }
  69.     }
  70.  
  71.     void del(node* &root) {
  72.         if (root == nullptr) {
  73.             return;
  74.         }
  75.         del(root->l);
  76.         del(root->r);
  77.         if (root->l == nullptr && root->r == nullptr) {
  78.             cout << "clidren already nullptr\n";
  79.         }
  80.         cout << "del:" << root->val << "\n";
  81.         delete root;
  82.         root = nullptr;
  83.         if (root == nullptr) {
  84.             cout << "successfully deleted\n";
  85.             cout << "\n";
  86.         }
  87.     }
  88. };
  89.  
  90. bool cmp(node* root1, node* root2) {
  91.      if  (root1 == nullptr) {
  92.         if (root2 != nullptr) {
  93.             return 0;
  94.         }
  95.         return 1;
  96.      }  else if(root2 == nullptr){
  97.          if (root1 != nullptr) {
  98.             return 0;
  99.          }
  100.          return 1;
  101.      }
  102.      if (root1->val != root2->val) {
  103.         return 0;
  104.      }
  105.      bool L = cmp(root1->l, root2->l);
  106.      bool R = cmp(root1->r, root2->r);
  107.      return L & R;
  108. }
  109.  
  110.  
  111. bool cmp_tree(tree T1, tree T2) {
  112.     bool ans = cmp(T1.main_root, T2.main_root);
  113.     return ans;
  114. }
  115.  
  116. int main() {
  117.     /*cin.tie(0);
  118.     cout.tie(0);
  119.     ios::sync_with_stdio(false);*/
  120.     tree T1, T2;
  121.     //vector<int> a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
  122.     vector<int> a = {1, 2, 3, 4, 5, 6, 7, 8};
  123.     //vector<int> b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
  124.     T1.create(a);
  125.     T1.trav(T1.main_root); cout << "\n";
  126.     //T2.create(b);
  127.     //bool ans = cmp_tree(T1, T2);
  128.     //cout << ans << "\n";
  129.     T1.del(T1.main_root);
  130.     cout  << T1.main_root << "\n";
  131.     if (T1.main_root == nullptr) {
  132.         cout << "ok\n";
  133.     }
  134.     // Освобождение памяти
  135.     // Здесь может быть реализована функция для удаления дерева и освобождения памяти
  136.     return 0;
  137. }
  138.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement