Advertisement
CyberN00b

clown tree

Jan 8th, 2023
618
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct Node{
  6.  
  7.     long long int bro;
  8.     long long int left_son;
  9.     long long int parent;
  10.     long long int val;
  11.  
  12.     Node(long long int val, long long int parent=-1) {
  13.         this->val = val;
  14.         this->parent = parent;
  15.         bro = -1;
  16.         left_son = -1;
  17.     }
  18.  
  19. };
  20.  
  21. struct Tree{
  22.  
  23.     void insert(long long int val) {
  24.         if (nodes.empty())
  25.             insert(-1, -1, val);
  26.         else
  27.             insert(0, -1, val);
  28.     }
  29.  
  30.     bool contains(long long int val) {
  31.         if (nodes.empty())
  32.             return false;
  33.         return contains(0, val);
  34.     }
  35.  
  36. private:
  37.  
  38.     void insert(long long int index, long long int parent, long long int val) {
  39.         if (index == -1) {
  40.             nodes.push_back(new Node(val, parent));
  41.             check_node(nodes.size() - 1);
  42.             return;
  43.         }
  44.         if (val > nodes[index]->val) {
  45.             insert(get_right_son(index), index, val);
  46.         } else {
  47.             insert(get_left_son(index), index, val);
  48.         }
  49.     }
  50.  
  51.     bool contains(long long int index, long long int val) {
  52.         if (index == -1)
  53.             return false;
  54.         if (val == nodes[index]->val)
  55.             return true;
  56.         return contains(get_left_son(index), val) || contains(get_right_son(index), val);
  57.     }
  58.  
  59.     void check_node(long long int index) {
  60.         long long int parent = nodes[index]->parent;
  61.         if (parent != -1)
  62.             if (is_right(parent, nodes[index]->val)) {
  63.                 if (nodes[parent]->left_son != -1)
  64.                     nodes[nodes[parent]->left_son]->bro = index;
  65.             } else {
  66.                 nodes[parent]->left_son = index;
  67.                 for (long long int i = parent + 1; i < nodes.size(); ++i) {
  68.                     if (i == index)
  69.                         continue;
  70.                     if (nodes[i]->parent == parent) {
  71.                         nodes[index]->bro = i;
  72.                         break;
  73.                     }
  74.                 }
  75.             }
  76.     }
  77.  
  78.     long long int get_left_son( long long int index) {
  79.         return nodes[index]->left_son;
  80.     }
  81.  
  82.     bool is_right(long long int parent_index, long long int val) {
  83.         return nodes[parent_index]->val < val;
  84.     }
  85.  
  86.     long long int get_right_son( long long int index) {
  87.         if (nodes[index]->left_son != -1)
  88.             return nodes[nodes[index]->left_son]->bro;
  89.         for (long long int i = index + 1; i < nodes.size(); ++i) {
  90.             if (nodes[i]->parent == index)
  91.                 return i;
  92.         }
  93.         return -1;
  94.     }
  95.  
  96.     vector<Node*> nodes;
  97. };
  98.  
  99. int main() {
  100.     int a;
  101.     cin >> a;
  102.     Tree tree;
  103.     for (int i = 0; i < a; ++i) {
  104.         int t;
  105.         cin >> t;
  106.         tree.insert(t);
  107.     }
  108.     cout << "end";
  109. }
  110.  
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement