Advertisement
Korotkodul

tree1

Apr 18th, 2025
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 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) {
  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);
  31.         root->r = create_subtree(root, (Ri + Li) / 2 + 1, Ri);
  32.  
  33.         return root; // Возвращаем указатель на созданный узел
  34.     }
  35.  
  36.     // Инициализация дерева
  37.     void create(vector<int> a) {
  38.         arr = a;
  39.         cur_size = a.size();
  40.         if (a.size() == 0) {
  41.             main_root = nullptr; // В случае пустого массива
  42.         } else {
  43.             main_root = create_subtree(nullptr, 0, arr.size() - 1);
  44.         }
  45.         cout << "Tree created\n";
  46.     }
  47.  
  48.     // Обход дерева (in-order)
  49.     void trav(node* root) {
  50.         if (root == nullptr) return; // Проверка на nullptr
  51.         trav(root->l); // Обход левого поддерева
  52.         cout << root->val << " "; // Обработка текущего узла
  53.         trav(root->r); // Обход правого поддерева
  54.     }
  55.     /*
  56.     void replace_el(node* root, int Li, int Ri, int i, int x) {
  57.         if (root == nullptr) return;
  58.  
  59.         int mid = (Li + Ri) / 2;
  60.         if (i == mid) {
  61.             root->val = x;  // Нашли нужный индекс
  62.             return;
  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 replace_el(node* root, int Li, int Ri, int i, int x) {
  72.         if (root == nullptr) return;
  73.  
  74.         if (Li == Ri) {  // Если это лист, и его индекс == i
  75.             if (i == Li) {
  76.                 root->val = x;
  77.             }
  78.             return;
  79.         }
  80.  
  81.         int mid = (Li + Ri) / 2;
  82.         if (i < mid) {
  83.             replace_el(root->l, Li, mid, i, x);  // Ищем в левом поддереве
  84.         } else {
  85.             replace_el(root->r, mid + 1, Ri, i, x);  // Ищем в правом поддереве
  86.         }
  87.     }
  88. };
  89.  
  90. int main() {
  91.     tree T;
  92.     vector<int> a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
  93.     T.create(a);
  94.     cout << "TRAVERSAL ORDER:\n";
  95.     T.trav(T.main_root); cout << "\n";
  96.     T.replace_el(T.main_root, 0, T.cur_size - 1, 0, 999);
  97.     T.trav(T.main_root); cout << "\n";
  98.     T.replace_el(T.main_root, 0, T.cur_size - 1, 18, 999);
  99.     T.trav(T.main_root); cout << "\n";
  100.  
  101.     // Освобождение памяти
  102.     // Здесь может быть реализована функция для удаления дерева и освобождения памяти
  103.     return 0;
  104. }
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement