Advertisement
Korotkodul

tree7

Apr 12th, 2025 (edited)
10
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 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\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. left_root = create_subtree(root.self, Li, Li);
  43. root.l = left_root.self;
  44. return root;
  45. }
  46. left_root = create_subtree(root.self, Li, (Ri + Li) / 2 - 1);
  47. right_root = create_subtree(root.self, (Ri + Li) / 2 + 1, Ri);
  48. root.l = left_root.self;
  49. root.r = right_root.self;
  50. return root;
  51. }
  52. void create(vector <int> a) {
  53. arr = a;
  54. if (a.size() == 0) {
  55. return;
  56. }
  57. int len = a.size();
  58. main_root = create_subtree(nullptr, 0, len - 1);
  59. cout << "created\n";
  60. return;
  61. }
  62. /*node find_first(node v) {
  63. node res = v;
  64. while (v.l != nullptr) {
  65. res = &(res.l);
  66. }
  67. return res;
  68. }
  69. node find_next(node v) {
  70. return;
  71. }*/
  72. void trav(node root) {
  73. cout << "trav\n";
  74. cout << root.val << "\n";
  75. if (root.l == nullptr && root.r == nullptr) {
  76. cout << root.val << " ";
  77. return;
  78. }
  79. if (root.l != nullptr) {
  80. trav(*(root.l));
  81. }
  82. cout << root.val << " ";
  83. if (root.r != nullptr) {
  84. trav(*(root.r));
  85. }
  86. }
  87. void insert_after(node v) { //а insert_defore надо?
  88. return;
  89. }
  90. };
  91.  
  92. int main() {
  93. tree T;
  94. vector <int> a = {1, 2, 3, 4, 5};
  95. T.create(a);
  96. cout << "TRAVERSAL ORDER\n";
  97. T.trav(T.main_root);
  98. }
  99.  
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement