Advertisement
LegoSosiska

Untitled

Apr 13th, 2022
969
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 29.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <SFML/Graphics.hpp>
  3. #include <SFML/Window.hpp>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <cmath>
  7. #include <vector>
  8.  
  9. struct Node {
  10.     Node* left = nullptr;
  11.     Node* right = nullptr;
  12.     Node* prev = nullptr;
  13.     int key = 0;
  14.     int priority = 0;
  15.     int color = 0;
  16.     int height = 1;
  17.     int size = 1;
  18. };
  19.  
  20. void Swap(Node*& a, Node*& b) {
  21.  
  22. }
  23.  
  24. int Size(Node* treap) {
  25.     return treap == nullptr ? 0 : treap->size;
  26. }
  27.  
  28. int Recalc(Node* treap) {
  29.     return Size(treap->left) + Size(treap->right) + 1;
  30. }
  31.  
  32. Node* Create(int key, int color = 0) {
  33.     Node* p = new Node;
  34.     p->key = key;
  35.     p->color = color;
  36.     p->priority = std::rand() % 1000000000;
  37.     return p;
  38. }
  39.  
  40. bool CheckColor(Node* p) {
  41.     if (p == nullptr) return true;
  42.     if (p->color == 0) return true;
  43.     if (p->color == 1) return false;
  44. }
  45.  
  46. struct Avl {
  47.     Node* root = nullptr;
  48.  
  49.     Node* find(int key, Node* search) {
  50.         if (search == nullptr) {
  51.             return nullptr;
  52.         }
  53.         if (search->key == key) {
  54.             return search;
  55.         }
  56.         if (key > search->key) {
  57.             return find(key, search->right);
  58.         }
  59.         if (key < search->key) {
  60.             return find(key, search->left);
  61.         }
  62.     }
  63.  
  64.     void fixHeight(Node* p) {
  65.         if (p == nullptr) {
  66.             return;
  67.         }
  68.         int left = 0, right = 0;
  69.         if (p->left != nullptr) {
  70.             left = p->left->height;
  71.             p->left->prev = p;
  72.         }
  73.         if (p->right != nullptr) {
  74.             right = p->right->height;
  75.             p->right->prev = p;
  76.         }
  77.         p->height = std::max(left, right) + 1;
  78.     }
  79.  
  80.     int dif(Node* p) {
  81.         if (p == nullptr) {
  82.             return 0;
  83.         }
  84.         int left = 0, right = 0;
  85.         if (p->left != nullptr) {
  86.             left = p->left->height;
  87.         }
  88.         if (p->right != nullptr) {
  89.             right = p->right->height;
  90.         }
  91.         return right - left;
  92.     }
  93.  
  94.     void rotateSmall(Node*& p, bool direction) {
  95.         if (p == nullptr) {
  96.             return;
  97.         }
  98.         Node* q;
  99.         if (!direction) {
  100.             q = p->right;
  101.             p->right = q->left;
  102.             q->left = p;
  103.         }
  104.         else {
  105.             q = p->left;
  106.             p->left = q->right;
  107.             q->right = p;
  108.         }
  109.         fixHeight(q);
  110.         fixHeight(p);
  111.         p = q;
  112.     }
  113.  
  114.     void rotateBig(Node* p, bool direction) {
  115.         if (p == nullptr) {
  116.             return;
  117.         }
  118.         Node* q, * r;
  119.         if (!direction) {
  120.             q = p->right;
  121.             r = q->left;
  122.             r->left = p;
  123.             r->right = q;
  124.         }
  125.         else {
  126.             q = p->left;
  127.             r = q->right;
  128.             r->right = p;
  129.             r->left = q;
  130.         }
  131.         fixHeight(p);
  132.         fixHeight(q);
  133.         fixHeight(r);
  134.         p = r;
  135.     }
  136.  
  137.     void balance(Node*& p) {
  138.         if (p == nullptr) {
  139.             return;
  140.         }
  141.         fixHeight(p);
  142.         if (dif(p) == 2) {
  143.             if (dif(p->right) < 0) {
  144.                 if (p->left != nullptr) {
  145.                     rotateSmall(p, true);
  146.                 }
  147.             }
  148.             if (p->right != nullptr) {
  149.                 rotateSmall(p, false);
  150.             }
  151.         }
  152.         if (dif(p) == -2) {
  153.             if (dif(p->left) > 0) {
  154.                 if (p->right != nullptr) {
  155.                     rotateSmall(p, false);
  156.                 }
  157.             }
  158.             if (p->left != nullptr) {
  159.                 rotateSmall(p, true);
  160.             }
  161.         }
  162.         return;
  163.     }
  164.  
  165.     bool insert(int key, Node*& p) {
  166.         if (find(key, root) != nullptr) {
  167.             return false;
  168.         }
  169.         if (p == nullptr) {
  170.             p = Create(key);
  171.             if (root == nullptr) {
  172.                 root = p;
  173.             }
  174.             return true;
  175.         }
  176.         if (key < p->key) {
  177.             insert(key, p->left);
  178.         }
  179.         else {
  180.             insert(key, p->right);
  181.         }
  182.         balance(p);
  183.         return true;
  184.     }
  185.  
  186.     Node* findMin(Node* search) {
  187.         if (search == nullptr) {
  188.             return nullptr;
  189.         }
  190.         if (search->left == nullptr) {
  191.             return search;
  192.         }
  193.         return findMin(search->left);
  194.     }
  195.  
  196.     void removeMin(Node*& search) {
  197.         if (search == nullptr) {
  198.             return;
  199.         }
  200.         if (search->left == nullptr) {
  201.             Node* toDelete = search;
  202.             search = search->right;
  203.             delete toDelete;
  204.             return;
  205.         }
  206.         removeMin(search->left);
  207.         balance(search);
  208.     }
  209.  
  210.     bool remove(int key, Node*& p) {
  211.         if (p == nullptr) {
  212.             return false;
  213.         }
  214.         if (key < p->key) {
  215.             remove(key, p->left);
  216.         }
  217.         else if (key > p->key) {
  218.             remove(key, p->right);
  219.         }
  220.         else {
  221.             Node* left = p->left;
  222.             Node* right = p->right;
  223.             Node* toDelete = p;
  224.             if (right == nullptr) {
  225.                 p = right;
  226.             }
  227.             p = findMin(right);
  228.             removeMin(right);
  229.             p->right = right;
  230.             p->left = left;
  231.             balance(p);
  232.             delete toDelete;
  233.             return true;
  234.         }
  235.         balance(p);
  236.         return true;
  237.     }
  238. };
  239.  
  240. struct Treap {
  241.     Node* root = nullptr;
  242.     Node* cur = nullptr;
  243.     Node* splitLeft = nullptr, * splitRight = nullptr;
  244.  
  245.     Node* find(int ind) {
  246.         Node* treap = this->root;
  247.         while (treap != nullptr) {
  248.             int leftSize = Size(treap);
  249.             if (leftSize == ind) {
  250.                 return treap;
  251.             }
  252.             if (leftSize < ind) {
  253.                 treap = treap->left;
  254.             } else {
  255.                 treap = treap->right;
  256.                 ind -= leftSize + 1;
  257.             }
  258.         }
  259.         return nullptr;
  260.     }
  261.  
  262.     void split(int key, Node*& treap, Node*& left, Node*& right) {
  263.         Node* newNode = nullptr;
  264.         if (treap->key < key) {
  265.             if (treap->right == nullptr) {
  266.                 right = nullptr;
  267.                 left = treap;
  268.             } else {
  269.                 split(key, treap->right, newNode, right);
  270.                 left = treap;
  271.                 left->right = newNode;
  272.             }
  273.         } else {
  274.             if (treap->left == nullptr) {
  275.                 left = nullptr;
  276.                 right = treap;
  277.             } else {
  278.                 split(key, treap->left, left, newNode);
  279.                 right = treap;
  280.                 right->left = newNode;
  281.             }
  282.         }
  283.     }
  284.  
  285.     Node* merge(Node* left, Node* right) {
  286.         if (left == nullptr) {
  287.             return right;
  288.         }
  289.         if (right == nullptr) {
  290.             return left;
  291.         }
  292.         if (right->priority > left->priority) {
  293.             Node* newNode = merge(left->right, right);
  294.             left->right = newNode;
  295.             return left;
  296.         } else {
  297.             Node* newNode = merge(left, right->left);
  298.             right->left = newNode;
  299.             return right;
  300.         }
  301.     }
  302.  
  303.     Node* insert(int key) {
  304.         if (find(key) != nullptr) {
  305.             return nullptr;
  306.         }
  307.         Node* node = Create(key);
  308.         if (root == nullptr) {
  309.             root = node;
  310.             return root;
  311.         }
  312.         Node* left, * right;
  313.         split(key, root, left, right);
  314.         left = merge(left, node);
  315.         root = merge(left, right);
  316.         return root;
  317.     }
  318.  
  319.     Node* remove(int key) {
  320.         if (find(key) == nullptr) {
  321.             return nullptr;
  322.         }
  323.         Node* left1, * left2, * right, * toDelete;
  324.         split(key - 1, root, left1, right);
  325.         split(key, left1, left2, toDelete);
  326.         delete toDelete;
  327.         root = merge(left2, right);
  328.         return root;
  329.     }
  330.  
  331. };
  332.  
  333. struct Splay {
  334.     Node* root = nullptr;
  335.  
  336.     Node* find(int key, Node* search) {
  337.         if (search == nullptr) {
  338.             return nullptr;
  339.         }
  340.         if (search->key == key) {
  341.             return splay(search);
  342.         }
  343.         if (key > search->key && search->right != nullptr) {
  344.             return find(key, search->right);
  345.         }
  346.         if (key < search->key && search->left != nullptr) {
  347.             return find(key, search->left);
  348.         }
  349.         return splay(search);
  350.     }
  351.  
  352.     void rotate(Node* par, Node* chld) {
  353.         Node* gpa = par->prev;
  354.         if (gpa != nullptr) {
  355.             if (gpa->left == par) {
  356.                 gpa->left = chld;
  357.             }
  358.             else {
  359.                 gpa->right = chld;
  360.             }
  361.         }
  362.         if (par->left == chld) {
  363.             par->left = chld->right;
  364.             if (chld->right != nullptr) {
  365.                 chld->right->prev = par;
  366.             }
  367.             chld->right = par;
  368.             par->prev = chld;
  369.         }
  370.         else {
  371.             par->right = chld->left;
  372.             if (chld->left != nullptr) {
  373.                 chld->left->prev = par;
  374.             }
  375.             chld->left = par;
  376.             par->prev = chld;
  377.         }
  378.         chld->prev = gpa;
  379.     }
  380.  
  381.     Node* splay(Node* p) {
  382.         if (p->prev == nullptr) {
  383.             return p;
  384.         }
  385.         Node* par = p->prev;
  386.         Node* gpa = p->prev->prev;
  387.         if (gpa == nullptr) {
  388.             rotate(par, p);
  389.             return p;
  390.         }
  391.         else {
  392.             if (gpa->left == par && par->left == p) {
  393.                 rotate(gpa, par);
  394.                 rotate(par, p);
  395.             }
  396.             else {
  397.                 rotate(par, p);
  398.                 rotate(gpa, p);
  399.             }
  400.             return splay(p);
  401.         }
  402.     }
  403.  
  404.     void split(Node*& p, Node*& left, Node*& right, int key) {
  405.         if (p == nullptr) {
  406.             left = nullptr;
  407.             right = nullptr;
  408.             return;
  409.         }
  410.         p = find(key, p);
  411.         if (p->key == key) {
  412.             if (p->left != nullptr) {
  413.                 p->left->prev = nullptr;
  414.             }
  415.             if (p->right != nullptr) {
  416.                 p->right->prev = nullptr;
  417.             }
  418.             right = p->right;
  419.             left = p->left;
  420.             return;
  421.         }
  422.         if (p->key < key) {
  423.             right = p->right;
  424.             p->right = nullptr;
  425.             if (right != nullptr) {
  426.                 right->prev = nullptr;
  427.             }
  428.             left = p;
  429.             p = nullptr;
  430.             return;
  431.         }
  432.         if (p->key > key) {
  433.             left = p->left;
  434.             p->left = nullptr;
  435.             if (left != nullptr) {
  436.                 left->prev = nullptr;
  437.             }
  438.             right = p;
  439.             p = nullptr;
  440.             return;
  441.         }
  442.  
  443.     }
  444.  
  445.     void insert(int key) {
  446.         Node* left, * right;
  447.         split(root, left, right, key);
  448.         if (root == nullptr) {
  449.             root = Create(key);
  450.         }
  451.         root->left = left;
  452.         root->right = right;
  453.         if (left != nullptr) {
  454.             left->prev = root;
  455.         }
  456.         if (right != nullptr) {
  457.             right->prev = root;
  458.         }
  459.     }
  460.  
  461.     Node* merge(Node* left, Node* right) {
  462.         if (left == nullptr) return right;
  463.         if (right == nullptr) return left;
  464.         right = find(left->key, right);
  465.         right->left = left;
  466.         left->prev = right;
  467.         return right;
  468.     }
  469.  
  470.     bool remove(int key) {
  471.         root = find(key, root);
  472.         if (root->key != key) {
  473.             return false;
  474.         }
  475.         Node* left = root->left, * right = root->right;
  476.         if (left != nullptr) {
  477.             left->prev = nullptr;
  478.         }
  479.         if (right != nullptr) {
  480.             right->prev = nullptr;
  481.         }
  482.         root = merge(left, right);
  483.         return true;
  484.     }
  485. };
  486.  
  487. struct RedBlack {
  488.  
  489.  
  490.     Node* root = nullptr;
  491.  
  492.     void insert(int key) {
  493.         Node* p = Create(key, 1);
  494.         if (root == nullptr) {
  495.             root = p;
  496.             p->color = 0;
  497.             return;
  498.         }
  499.         if (find(key, root) != nullptr) {
  500.             return;
  501.         }
  502.         place(p, root);
  503.         balance(p);
  504.     }
  505.  
  506.     Node* find(int key, Node* search) {
  507.         if (search == nullptr) {
  508.             return nullptr;
  509.         }
  510.         if (search->key == key) {
  511.             return search;
  512.         }
  513.         if (key > search->key) {
  514.             return find(key, search->right);
  515.         }
  516.         if (key < search->key) {
  517.             return find(key, search->left);
  518.         }
  519.     }
  520.  
  521.     void place(Node* q, Node* parent) {
  522.         if (q->key > parent->key) {
  523.             if (parent->right == nullptr) {
  524.                 parent->right = q;
  525.                 q->prev = parent;
  526.                 return;
  527.             }
  528.             place(q, parent->right);
  529.         }
  530.         else {
  531.             if (parent->left == nullptr) {
  532.                 parent->left = q;
  533.                 q->prev = parent;
  534.                 return;
  535.             }
  536.             place(q, parent->left);
  537.         }
  538.     }
  539.  
  540.     void balance(Node*& p) {
  541.         if (p->prev == nullptr) return;
  542.         if (p->prev->color == 0) return;
  543.         Node* par = p->prev, * gpa = p->prev->prev;
  544.         Node* bro = (par == gpa->left ? gpa->right : gpa->left);
  545.         if (bro != nullptr && bro->color == 1) {
  546.             par->color = 0;
  547.             bro->color = 0;
  548.             balance(gpa);
  549.         }
  550.         if (CheckColor(bro)) {
  551.             if (p == par->right && par == gpa->left) {
  552.                 p->prev = gpa;
  553.                 par->prev = p;
  554.                 par->right = p->left;
  555.                 p->left = par;
  556.                 gpa->left = p;
  557.                 std::swap(par, p);
  558.             }
  559.             else if (p == par->left && par == gpa->right) {
  560.                 p->prev = gpa;
  561.                 par->prev = p;
  562.                 par->left = p->right;
  563.                 p->right = par;
  564.                 gpa->right = p;
  565.                 std::swap(par, p);
  566.             }
  567.             if (gpa->left == par) {
  568.                 if (gpa->prev == nullptr) {
  569.                     root = par;
  570.                 }
  571.                 else {
  572.                     if (gpa->prev->left == gpa) {
  573.                         gpa->prev->left = par;
  574.                     }
  575.                     else {
  576.                         gpa->prev->right = par;
  577.                     }
  578.                 }
  579.                 par->prev = gpa->prev;
  580.                 gpa->prev = par;
  581.                 gpa->left = par->right;
  582.                 if (par->right != nullptr) {
  583.                     par->right->prev = gpa;
  584.                 }
  585.                 par->right = gpa;
  586.             }
  587.             else {
  588.                 if (gpa->prev == nullptr) {
  589.                     root = par;
  590.                 }
  591.                 else {
  592.                     if (gpa->prev->left == gpa) {
  593.                         gpa->prev->left = par;
  594.                     }
  595.                     else {
  596.                         gpa->prev->right = par;
  597.                     }
  598.                 }
  599.                 par->prev = gpa->prev;
  600.                 gpa->prev = par;
  601.                 gpa->right = par->left;
  602.                 if (par->left != nullptr) {
  603.                     par->left->prev = gpa;
  604.                 }
  605.                 par->left = gpa;
  606.             }
  607.             par->color = 0;
  608.             gpa->color = 1;
  609.             return;
  610.         }
  611.     }
  612.  
  613.     bool erase(int key) {
  614.         Node* q = find(key, root);
  615.         if (q == nullptr) {
  616.             return false;
  617.         }
  618.         Node* min = findMin(q->right);
  619.         if (min == nullptr) min = q;
  620.         q->key = min->key;
  621.         if (!CheckColor(min)) {
  622.             if (min->prev->left == min) {
  623.                 min->prev->left = nullptr;
  624.             }
  625.             else {
  626.                 min->prev->right = nullptr;
  627.             }
  628.             delete min;
  629.             return true;
  630.         }
  631.         if (!CheckColor(min->right)) {
  632.             if (min->right != nullptr) {
  633.                 min->right->prev = q->prev;
  634.                 if (min->prev->left == min) {
  635.                     min->prev->left = min->right;
  636.                 }
  637.                 else {
  638.                     min->prev->right = min->right;
  639.                 }
  640.                 min->left->color = 0;
  641.                 delete min;
  642.                 return true;
  643.             }
  644.         }
  645.        
  646.         Node* toDelete = min;
  647.         if (min->prev == nullptr) {
  648.             root = nullptr;
  649.             delete min;
  650.             return true;
  651.         }
  652.         if (min->prev->left == min) {
  653.             min->prev->left = min->right;
  654.         }
  655.         else {
  656.             min->prev->right = min->right;
  657.         }
  658.         min = min->right;
  659.         delete toDelete;
  660.         rbalance(min);
  661.         return true;
  662.     }
  663.  
  664.     void rbalance(Node* p) {
  665.         Node* par = p->prev, * bro = (p == par->left ? par->right : par->left);
  666.         Node* d1 = bro->right, * d2 = bro->left;
  667.         if (CheckColor(par) && CheckColor(bro) && CheckColor(d1) && CheckColor(d2)) {
  668.             bro->color = 1;
  669.             rbalance(par);
  670.             return;
  671.         }
  672.         if (!CheckColor(par) && CheckColor(bro) && CheckColor(d1) && CheckColor(d2)) {
  673.             par->color = 0;
  674.             bro->color = 1;
  675.             return;
  676.         }
  677.         if (CheckColor(bro) && CheckColor(d1) && !CheckColor(d2)) {
  678.             bro->prev = par->prev;
  679.             if (par->prev != nullptr) {
  680.                 if (par->prev->right == par) {
  681.                     par->prev->right = bro;
  682.                 }
  683.                 else {
  684.                     par->prev->left = bro;
  685.                 }
  686.             }
  687.             d2->color = 0;
  688.             par->right = d1;
  689.             bro->left = par;
  690.             par->prev = bro;
  691.             return;
  692.         }
  693.         if (CheckColor(bro) && !CheckColor(d1) && CheckColor(d2)) {
  694.             par->right = d1;
  695.             d1->prev = par;
  696.             bro->prev = d1;
  697.             bro->left = d1->right;
  698.             d1->right = bro;
  699.             d1->color = 0;
  700.             bro->color = 1;
  701.             std::swap(d1, bro);
  702.             std::swap(d1, d2);
  703.             bro->prev = par->prev;
  704.             if (par->prev != nullptr) {
  705.                 if (par->prev->right == par) {
  706.                     par->prev->right = bro;
  707.                 }
  708.                 else {
  709.                     par->prev->left = bro;
  710.                 }
  711.             }
  712.             d2->color = 0;
  713.             par->right = bro->left;
  714.             bro->left = par;
  715.             par->prev = bro;
  716.             return;
  717.         }
  718.         if (!CheckColor(bro)) {
  719.             if (par->prev != nullptr) {
  720.                 if (par->prev->right == par) {
  721.                     par->prev->right = bro;
  722.                 }
  723.                 else {
  724.                     par->prev->left = bro;
  725.                 }
  726.             }
  727.             bro->prev = par->prev;
  728.             par->prev = bro;
  729.             par->right = d1;
  730.             bro->left = par;
  731.             par->color = 1;
  732.             bro->color = 0;
  733.             if (d2 != nullptr) {
  734.                 d2->color = 1;
  735.             }
  736.             balance(p);
  737.             return;
  738.         }
  739.         return;
  740.     }
  741.  
  742.     Node* findMin(Node* p) {
  743.         if (p == nullptr) {
  744.             return nullptr;
  745.         }
  746.         if (p->left == nullptr) {
  747.             return p;
  748.         }
  749.         return findMin(p->left);
  750.     }
  751. };
  752.  
  753.  
  754.  
  755. void InOrder(Node* p, int layer = 0) {
  756.     if (p == nullptr) return;
  757.     InOrder(p->left, layer + 1);
  758.     std::cout << p->key << " ";
  759.     InOrder(p->right, layer + 1);
  760. }
  761.  
  762. void TreeOrder(Node* p) {
  763.     int layer = 0;
  764.     std::queue<std::pair<Node*, int>> queue;
  765.     std::pair<Node*, int> blank;
  766.     if (p != nullptr) {
  767.         blank = { p, layer };
  768.         queue.push(blank);
  769.     }
  770.     while (!queue.empty()) {
  771.         if (queue.front().second > layer) {
  772.             std::cout << "\n";
  773.             ++layer;
  774.         }
  775.         Node* q = queue.front().first;
  776.         std::cout << q->key << " ";
  777.         queue.pop();
  778.         if (q->left != nullptr) {
  779.             blank.second = layer + 1;
  780.             blank.first = q->left;
  781.             queue.push(blank);
  782.         }
  783.         if (q->right != nullptr) {
  784.             blank.second = layer + 1;
  785.             blank.first = q->right;
  786.             queue.push(blank);
  787.         }
  788.     }
  789. }
  790.  
  791.  
  792. sf::Font* font;
  793.  
  794. sf::Color textColor = sf::Color(232, 197, 71), backgroundColor = sf::Color(72, 64, 65), elementColor = sf::Color(254, 233, 225), fillColor = sf::Color(67, 67, 113), reactColor = sf::Color(217, 3, 104);
  795.  
  796. struct RenderNode {
  797.     sf::RectangleShape rect;
  798.     sf::Text text;
  799.     int height = 0;
  800.     Node* node = nullptr;
  801.     int key = 0;
  802.     sf::Vector2f scale;
  803.     RenderNode* left = nullptr, * right = nullptr;
  804.  
  805.     void create(Node* node, int key, int height, float scale) {
  806.         this->node = node;
  807.         this->key = key;
  808.         this->text.setString(std::to_string(key));
  809.         this->height = height;
  810.  
  811.         sf::Vector2f sc = { scale, scale };
  812.         this->scale = sc;
  813.  
  814.         rect.setSize(sf::Vector2f(150, 60));
  815.  
  816.         //text.setOrigin(text.getGlobalBounds().width / 2, text.getGlobalBounds().height / 2);
  817.         rect.setOrigin(75, 30);
  818.         text.setOrigin(75, 20);
  819.  
  820.         text.setFont(*font);
  821.         rect.setOutlineThickness(1);
  822.  
  823.         rect.setFillColor(fillColor);
  824.         text.setFillColor(textColor);
  825.         rect.setOutlineColor(elementColor);
  826.  
  827.         text.setScale(this->scale);
  828.         rect.setScale(this->scale);
  829.     }
  830.  
  831.     void grow(sf::Vector2f scale) {
  832.         this->scale = scale;
  833.         text.setScale(scale);
  834.         rect.setScale(scale);
  835.     }
  836.  
  837.     void setPos(sf::Vector2f pos) {
  838.         rect.setPosition(pos);
  839.         text.setPosition(pos);
  840.     }
  841.  
  842.     void draw(sf::RenderWindow& window) {
  843.         window.draw(rect);
  844.         window.draw(text);
  845.     }
  846. };
  847.  
  848. struct RenderTree {
  849.     std::vector<sf::Vertex> connections;
  850.     RenderNode* root = nullptr;
  851.     int height;
  852.  
  853.     void create(Node* tree, sf::Vector2f pos, float scale) {
  854.         int height = 0;
  855.         RenderNode* rend = createNodes(tree, height, scale);
  856.         root = rend;
  857.         positionNodes(rend, pos, height);
  858.         this->height = height;
  859.     }
  860.  
  861.     void positionNodes(RenderNode* rend, sf::Vector2f pos, int height) {
  862.         if (rend == nullptr) return;
  863.         rend->setPos(pos);
  864.         positionNodes(rend->left, { pos.x - 80 * (int)pow(2, height - 2) * rend->scale.x, pos.y + 200 * rend->scale.x }, height - 1);
  865.         positionNodes(rend->right, { pos.x + 80 * (int)pow(2, height - 2) * rend->scale.x , pos.y + 200 * rend->scale.x}, height - 1);
  866.         return;
  867.     }
  868.  
  869.     RenderNode* createNodes(Node* tree, int& height, float scale) {
  870.         if (tree == nullptr) {
  871.             return nullptr;
  872.         }
  873.        
  874.         int h1 = height, h2 = height;
  875.         RenderNode* rend = new RenderNode;
  876.         rend->left = createNodes(tree->left, h1, scale);
  877.         rend->right = createNodes(tree->right, h2, scale);
  878.         height = std::max(h1, h2) + 1;
  879.         rend->create(tree, tree->key, height, scale);
  880.         return rend;
  881.     }
  882.  
  883.     void scale(RenderNode* rend, float scaleNum) {
  884.         if (rend == nullptr) return;
  885.         sf::Vector2f s = { scaleNum, scaleNum };
  886.         rend->grow(s);
  887.         scale(rend->left, scaleNum);
  888.         scale(rend->right, scaleNum);
  889.     }
  890.  
  891.     void draw(sf::RenderWindow& window) {
  892.        
  893.         drawNodes(window, root);
  894.     }
  895.  
  896.     void drawNodes(sf::RenderWindow& window, RenderNode* rend) {
  897.         if (rend == nullptr) return;
  898.         if (rend->left != nullptr) {
  899.             sf::Vector2f pos1, pos2;
  900.             pos1 = { rend->rect.getPosition().x, rend->rect.getPosition().y };
  901.             pos2 = { rend->left->rect.getPosition().x, rend->left->rect.getPosition().y};
  902.             sf::Vertex line[] = {
  903.                 sf::Vertex(pos1),
  904.                 sf::Vertex(pos2)
  905.             };
  906.             window.draw(line, 2, sf::Lines);
  907.         }
  908.         if (rend->right != nullptr) {
  909.             sf::Vector2f pos1, pos2;
  910.             pos1 = { rend->rect.getPosition().x, rend->rect.getPosition().y };
  911.             pos2 = { rend->right->rect.getPosition().x, rend->right->rect.getPosition().y };
  912.             sf::Vertex line[] = {
  913.                 sf::Vertex(pos1),
  914.                 sf::Vertex(pos2)
  915.             };
  916.             window.draw(line, 2, sf::Lines);
  917.         }
  918.         rend->draw(window);
  919.         drawNodes(window, rend->left);
  920.         drawNodes(window, rend->right);
  921.     }
  922.  
  923.     void clear() {
  924.         connections.clear();
  925.         clearNodes(root);
  926.         root = nullptr;
  927.     }
  928.  
  929.     void clearNodes(RenderNode* rend) {
  930.         if (rend == nullptr) {
  931.             return;
  932.         }
  933.         clearNodes(rend->left);
  934.         clearNodes(rend->right);
  935.         delete rend;
  936.     }
  937.  
  938.    /* bool contains(float x, float y, int type, RenderNode* node = nullptr, bool first = false) {
  939.         if (node == nullptr && !first) {
  940.             node = root;
  941.             first = true;
  942.         }
  943.         if (node == nullptr) return;
  944.         if (node->rect.getGlobalBounds().contains(x, y)) {
  945.             erase()
  946.         }
  947.     }*/
  948. };
  949.  
  950. void InOrder2(RenderNode* p, int layer = 0) {
  951.     if (p == nullptr) return;
  952.     InOrder2(p->left, layer + 1);
  953.     std::cout << p->key << " ";
  954.     InOrder2(p->right, layer + 1);
  955. }
  956.  
  957. void MousePressed(float x, float y) {
  958.    
  959. }
  960.  
  961. int main() {
  962.     sf::RenderWindow window(sf::VideoMode(1000, 1000), "FUNKY GROOVY COME TO THE CLUB FOR FREE AND GET YOURSELF A FREE DRINK");
  963.  
  964.     RedBlack splay;
  965.     RenderTree renderTree;
  966.     sf::Vertex line[] =
  967.     {
  968.         sf::Vertex(sf::Vector2f(10.f, 10.f)),
  969.         sf::Vertex(sf::Vector2f(150.f, 150.f))
  970.     };
  971.  
  972.     font = new sf::Font;
  973.     if (!font->loadFromFile("UbuntuMono-Regular.ttf")) {
  974.         std::cout << "err\n";
  975.     }
  976.    
  977.     sf::Vector2f treePos = { 500, 50 };
  978.     float scale = 1;
  979.  
  980.     while (window.isOpen()) {
  981.  
  982.  
  983.          sf::Event event;
  984.          while (window.pollEvent(event)) {
  985.              if (event.type == sf::Event::Closed) {
  986.                  window.close();
  987.              }
  988.              if (event.type == sf::Event::KeyPressed) {
  989.                  if (event.key.code == sf::Keyboard::Enter) {
  990.                      renderTree.clear();
  991.                      int k = 0;
  992.                      while (k != 556) {
  993.                          std::cin >> k;
  994.                          splay.insert(k);
  995.                      }
  996.                      InOrder(splay.root);
  997.                      std::cout << '\n';
  998.  
  999.                      renderTree.create(splay.root, treePos, scale);
  1000.  
  1001.                      InOrder2(renderTree.root);
  1002.                  }
  1003.                  if (event.key.code == sf::Keyboard::P) {
  1004.                      if (scale <= 0.2) {
  1005.                          scale += 0.02;
  1006.                      }
  1007.                      else {
  1008.                         scale += 0.1;
  1009.                      }
  1010.                      
  1011.                      renderTree.scale(renderTree.root, scale);
  1012.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1013.                  }
  1014.                  if (event.key.code == sf::Keyboard::O) {
  1015.                      if (scale <= 0.2 && scale > 0.02) {
  1016.                          scale -= 0.02;
  1017.                          renderTree.scale(renderTree.root, scale);
  1018.                          renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1019.                      }
  1020.                      else if (scale > 0.2) {
  1021.                          scale -= 0.1;
  1022.                          renderTree.scale(renderTree.root, scale);
  1023.                          renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1024.                      }
  1025.                      
  1026.                  }
  1027.                  if (event.key.code == sf::Keyboard::Up) {
  1028.                      treePos.y += 5 * scale * 10;
  1029.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1030.                  }
  1031.                  if (event.key.code == sf::Keyboard::Down) {
  1032.                      treePos.y -= 5 * scale * 10;
  1033.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1034.                  }
  1035.                  if (event.key.code == sf::Keyboard::Left) {
  1036.                      treePos.x += 5 * scale * 10;
  1037.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1038.                  }
  1039.                  if (event.key.code == sf::Keyboard::Right) {
  1040.                      treePos.x -= 5 * scale * 10;
  1041.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1042.                  }
  1043.                  
  1044.              }
  1045.          }
  1046.          
  1047.  
  1048.          window.clear(backgroundColor);
  1049.  
  1050.          renderTree.draw(window);
  1051.  
  1052.          window.display();
  1053.     }
  1054. }
  1055.  
  1056. /*
  1057. Avl avl;
  1058.     while (true) {
  1059.         int a;
  1060.         std::cin >> a;
  1061.         if (a == 0) {
  1062.             InOrder(avl.root);
  1063.             std::cout << "\n";
  1064.             TreeOrder(avl.root);
  1065.         }
  1066.         if (a == 1) {
  1067.             int key;
  1068.             std::cin >> key;
  1069.             std::cout << avl.insert(key, avl.root) << "\n";
  1070.         }
  1071.         if (a == 2) {
  1072.             int key;
  1073.             std::cin >> key;
  1074.             std::cout << avl.remove(key, avl.root) << "\n";
  1075.         }
  1076.         if (a >= 3) {
  1077.             for (int i = 0; i < a; ++i) {
  1078.                 int k;
  1079.                 int key;
  1080.                 std::cin >> key;
  1081.                 std::cout << avl.insert(key, avl.root) << "\n";
  1082.             }
  1083.         }
  1084.     }
  1085. */
  1086.  
  1087. /*
  1088. 5
  1089. 3 10 15 30 29
  1090.  
  1091.  
  1092. 437
  1093. 3485
  1094. 238
  1095. 483
  1096. 285
  1097. 22
  1098. 355
  1099. 348
  1100. 345
  1101. 23
  1102. 25699
  1103. 8346867
  1104. 934988
  1105. 483276
  1106. 2931
  1107. 59328528
  1108. 283582385
  1109. 38723
  1110. 237582358
  1111. 2
  1112. 32735285
  1113. 69
  1114. 1585
  1115. 3382
  1116. 384
  1117. 23415
  1118. 2643
  1119. 523
  1120. 247724
  1121. 999999999
  1122. 556
  1123. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement