Advertisement
Korotkodul

tree8

Apr 12th, 2025
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <exception>
  4. #include <cmath>
  5. #include <unordered_set>
  6. #include <vector>
  7. #include <unordered_map>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. const int inf = 2e9;
  12.  
  13. struct node{
  14.     node* self;
  15.     node* parent;
  16.     node* l;
  17.     node* r;
  18.     int val;
  19.     node(node *par) : parent(par), l(nullptr), r(nullptr), self(this), val(inf) {}
  20.     node() : parent(nullptr), l(nullptr), r(nullptr), self(this),val (inf) {}
  21.     node(node *par, node *L, node *R) : parent(par), l(L), r(R), self(this), val(inf) {}
  22. };
  23.  
  24. struct tree{
  25.     vector <int> arr; //используется ТОЛЬКО для инициализациидерева
  26.     node main_root;
  27.     node create_subtree(node* par, int Li, int Ri) {
  28.         /*Ri == Li + 2 - работает по алгоритмы
  29.         Ri == Li + 1 - особ случ
  30.         Ri == Li - особ случ*/
  31.         node root(par);
  32.         root.val = this->arr[(Ri + Li) / 2];
  33.         cout << "creating\n";
  34.         cout << "Li Ri: " << Li << ' ' << Ri << "\n";
  35.         cout << root.val << "\n";
  36.         node left_root;
  37.         node right_root;
  38.         if (Ri == Li) {
  39.             return root;
  40.         }
  41.         if (Ri == Li + 1) { //Ri - root, Li - left_root
  42.             root.val = this->arr[(Ri + Li) / 2 + 1];
  43.             cout << "change val: " << root.val << "\n";
  44.             left_root = create_subtree(root.self, Li, Li);
  45.             root.l = left_root.self;
  46.             return root;
  47.         }
  48.         cout << "\n";
  49.         left_root = create_subtree(root.self, Li, (Ri + Li) / 2 - 1);
  50.         right_root = create_subtree(root.self, (Ri + Li) / 2 + 1, Ri);
  51.         root.l = left_root.self;
  52.         root.r = right_root.self;
  53.         return root;
  54.     }
  55.     void create(vector <int> a) {
  56.         arr = a;
  57.         if (a.size() == 0) {
  58.             return;
  59.         }
  60.         int len = a.size();
  61.         main_root = create_subtree(nullptr, 0, len - 1);
  62.         cout << "created\n";
  63.         return;
  64.     }
  65.     /*node find_first(node  v) {
  66.         node res = v;
  67.         while (v.l != nullptr) {
  68.             res = &(res.l);
  69.         }
  70.         return res;
  71.     }
  72.     node find_next(node v) {
  73.         return;
  74.     }*/
  75.     void trav(node root) {
  76.         cout << "trav\n";
  77.         cout << root.val << "\n";
  78.         if (root.l == nullptr && root.r == nullptr) {
  79.             cout << root.val << " ";
  80.             return;
  81.         }
  82.         if (root.l != nullptr) {
  83.             trav(*(root.l));
  84.         }
  85.         cout << root.val << " ";
  86.         if (root.r != nullptr) {
  87.             trav(*(root.r));
  88.         }
  89.     }
  90.     void insert_after(node v) { //а insert_defore надо?
  91.         return;
  92.     }
  93. };
  94.  
  95. int main() {
  96.     tree T;
  97.     vector <int> a = {1, 2, 3, 4, 5};
  98.     T.create(a);
  99.     cout << "TRAVERSAL ORDER\n";
  100.     T.trav(T.main_root);
  101. }
  102.  
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement