SHARE
    TWEET
    Korotkodul

    tree3

    Apr 19th, 2025
    493
    0
    Never
    Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
    C++ 3.24 KB | None | 0 0
    1. #include <iostream>
    2. #include <vector>
    3. using namespace std;
    4. const int inf = 2e9;
    5. struct node {
    6. node* parent;
    7. node* l;
    8. node* r;
    9. int val;
    10. node(node* par) : parent(par), l(nullptr), r(nullptr), val(inf) {}
    11. node() : parent(nullptr), l(nullptr), r(nullptr), val(inf) {}
    12. };
    13. struct tree {
    14. vector<int> arr; // используется ТОЛЬКО для инициализации дерева
    15. node* main_root; // Изменен на указатель для удобства
    16. int cur_size = 0;
    17. // Создает поддерево
    18. node* create_subtree(node* par, int Li, int Ri) {
    19. if (Li > Ri) return nullptr; // Проверка на правильные границы
    20. node* root = new node(par);
    21. root->val = arr[(Ri + Li) / 2]; // устанавливаем значение корня
    22. // Создание левого и правого поддеревьев
    23. root->l = create_subtree(root, Li, (Ri + Li) / 2 - 1);
    24. root->r = create_subtree(root, (Ri + Li) / 2 + 1, Ri);
    25. return root; // Возвращаем указатель на созданный узел
    26. }
    27. // Инициализация дерева
    28. void create(vector<int> a) {
    29. arr = a;
    30. cur_size = a.size();
    31. if (a.size() == 0) {
    32. main_root = nullptr; // В случае пустого массива
    33. } else {
    34. main_root = create_subtree(nullptr, 0, arr.size() - 1);
    35. }
    36. cout << "Tree created\n";
    37. }
    38. // Обход дерева (in-order)
    39. void trav(node* root) {
    40. if (root == nullptr) return; // Проверка на nullptr
    41. trav(root->l); // Обход левого поддерева
    42. cout << root->val << " "; // Обработка текущего узла
    43. trav(root->r); // Обход правого поддерева
    44. }
    45. void replace_el(node* root, int Li, int Ri, int i, int x) {
    46. if (root == nullptr) return;
    47. int mid = (Li + Ri) / 2;
    48. if (i == mid) { // Нашли узел, который нужно заменить
    49. root->val = x;
    50. return;
    51. }
    52. if (i < mid) {
    53. replace_el(root->l, Li, mid - 1, i, x); // Ищем в левом поддереве
    54. } else {
    55. replace_el(root->r, mid + 1, Ri, i, x); // Ищем в правом поддереве
    56. }
    57. }
    58. };
    59. int main() {
    60. tree T;
    61. vector<int> a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21};
    62. T.create(a);
    63. cout << "TRAVERSAL ORDER:\n";
    64. T.trav(T.main_root); cout << "\n";
    65. /*T.replace_el(T.main_root, 0, T.cur_size - 1, 0, 999);
    66. T.trav(T.main_root); cout << "\n";
    67. T.replace_el(T.main_root, 0, T.cur_size - 1, 18, 999);
    68. T.trav(T.main_root); cout << "\n";*/
    69. for (int i = 0; i < 21; ++i) {
    70. T.replace_el(T.main_root, 0, T.cur_size - 1, i, 999);
    71. T.trav(T.main_root); cout << "\n";
    72. }
    73. // Освобождение памяти
    74. // Здесь может быть реализована функция для удаления дерева и освобождения памяти
    75. return 0;
    76. }
    Advertisement
    Add Comment
    Please, Sign In to add comment
    Public Pastes
    We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
    Not a member of Pastebin yet?
    Sign Up, it unlocks many cool features!

    AltStyle によって変換されたページ (->オリジナル) /