vadimk772336

много принтов работает

Nov 20th, 2021 (edited)
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.91 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Node
  5. {
  6.     int key; // ключ узла
  7.     int idx;
  8.     Node* left; // указатель на левого потомка
  9.     Node* right; // указатель на правого потомка
  10.     Node* parent; // указатель на предка
  11. };
  12.  
  13. /*
  14. Первая вершина всегда будет в корне. Затем, пока не будут использованы все значения,
  15. будем последовательно подвешивать левых сыновей к последней добавленной вершине, пока не найдём
  16. номер,
  17. нарушающий убывающую последовательность,
  18.  
  19. а для каждого такого номера будем искать вершину без правого потомка,
  20. хранящую наибольшее значение, не превосходящее того, которое хотим поставить, и подвешиваем к ней
  21. элемент
  22. с таким номером в качестве правого сына.
  23.  
  24. Когда мы, желая найти такую вершину, встречаем какую-нибудь другую,
  25. уже имеющую правого сына, проходим по ветке вправо. Мы имеем на это право, так как если такая
  26. вершина стоит,
  27. то процедура обхода в ней уже побывала и поворачивала вправо, поэтому спускаться в другую сторону
  28. смысла не имеет.
  29.  
  30. Вершину с максимальным ключом, с которой будем начинать поиск, будем запоминать. Она будет
  31. обновляться каждый раз,
  32. когда появится новый максимум.
  33. */
  34.  
  35. void find_parent(int* l, int* r, int idx, Node* tree)
  36. {
  37.     cout << "Зашёл в поиск родителя для ключа " << tree[idx].key << endl;
  38.  
  39.     //сравниваю на больше меньше и решаю куда идти пока не встречу без правого
  40.     //Сравниваю с корнем и понимаю в максимум какой ветки смотреть
  41.  
  42.     int idx_left = *l;
  43.     int idx_right = *r;
  44.  
  45.     bool is_greater;
  46.     is_greater = tree[0].key < tree[idx].key;
  47.  
  48.     /* Думаю можно так (вне этой фун вообще)
  49.     if (is_greater)
  50.         idx_right = idx;
  51.     else
  52.         idx_left = idx;
  53.     */
  54.    
  55.     Node* curr;
  56.     if (is_greater)
  57.     {
  58.         curr = &tree[idx_right];
  59.         cout << "Т.к. ключ больше верны то смотрим правый макс, curr =  " << curr->key << endl;
  60.     }
  61.     else
  62.     {
  63.         curr = &tree[idx_left];
  64.         cout << "Т.к. ключ меньше вершины то смотрим левый макс, curr = " << curr->key << endl;
  65.     }
  66.  
  67.     if (curr->key <= tree[idx].key && curr->right == NULL)
  68.     {
  69.         cout << "Нашёл родителя - " << curr->key << endl;
  70.        
  71.         tree[idx].parent = curr;
  72.         curr->right = &tree[idx];
  73.         cout << "есть ли указатель " <<(curr->right->key) << endl;
  74.  
  75.         if (is_greater)
  76.         {
  77.             idx_right = tree[idx].idx;
  78.             *r = idx;
  79.             cout << "теперь idx_right = " << idx_right << endl;
  80.         }
  81.         else
  82.         {
  83.             idx_left = tree[idx].idx;
  84.             *l = idx;
  85.             cout << "теперь *l = " << *l << endl;
  86.         }
  87.     }
  88.  
  89.     else if (curr->key > tree[idx].key)
  90.     {
  91.         cout << "макс больше ключа, запускаю от левого сына" << endl;
  92.         if (is_greater)
  93.         {
  94.             *r = tree[idx_right].left->idx;
  95.             find_parent(l, r, idx, tree);
  96.         }
  97.         else
  98.         {
  99.             *l = tree[idx_left].left->idx;
  100.             find_parent(l, r, idx, tree);
  101.         }
  102.     }
  103.    
  104.     else if (curr->right != NULL)
  105.     {
  106.         cout << "справа занято, запускаю от правого сына" << endl;
  107.         if (is_greater)
  108.         {
  109.             // int* new_idx_right = tree[idx_right].right->idx;
  110.             *r = tree[idx_right].right->idx;
  111.             find_parent(l, r, idx, tree);
  112.         }
  113.         else
  114.         {
  115.             // int* new_idx_left = tree[idx_left].left->idx;
  116.             *l = tree[idx_left].right->idx;
  117.             find_parent(l, r, idx, tree);
  118.         }
  119.     }
  120.  
  121.  
  122.     cout << "Конец" << endl;
  123.     return;
  124. }
  125.  
  126.  
  127. void f(int k, Node* tree, int n, int* idx_left, int* idx_right)
  128. {
  129.    
  130.     while (k < n - 1 && tree[k + 1].key <= tree[k].key) //<= ?
  131.     {
  132.         cout << "k= " << k << " tree[k + 1].key ,tree[k].key = " << tree[k + 1].key << " " << tree[k].key << endl;
  133.         cout << "in" <<  endl;
  134.         tree[k].left = &tree[k + 1];
  135.         tree[k + 1].parent = &tree[k];
  136.         k++;
  137.     }
  138.  
  139.     if (k + 1 <= n - 1)
  140.     {
  141.         cout << tree[k + 1].key << " нарушила убывание, ищу куда вставить ее" << endl;
  142.         find_parent(idx_left, idx_right, k + 1, tree); //Обновляем вершину с макс ключом и вставляем k+1-ую
  143.         cout << "есть ли указатель " <<(tree[1].right == NULL) << endl;
  144.     }
  145.     if (k + 2 <= n - 1)
  146.     { //Если посмотрели еще не все вершины то запускаем
  147.         cout << "Ещё не все посмотрели, запускаю от " << tree[k + 1].key << endl;
  148.         f(k + 1, tree, n, idx_left, idx_right);
  149.     }
  150. }
  151.  
  152. void preorderTraversal(Node* x)
  153. {
  154.     if (x != NULL)
  155.     {
  156.         cout << "Зашёл, текущий ключ = ";
  157.         cout << x->key << endl;
  158.         preorderTraversal(x->left);
  159.         preorderTraversal(x->right);
  160.     }
  161.     return;
  162. }
  163.  
  164. int main()
  165. {
  166.     int n;
  167.     cin >> n;
  168.  
  169.     Node tree[n];
  170.     for (int i = 0; i < n; ++i)
  171.     {
  172.         tree[i].right = NULL;
  173.         tree[i].left = NULL;
  174.         tree[i].parent = NULL;
  175.         tree[i].idx = i;
  176.         cin >> tree[i].key; //Массив вершин, в i-ой вершине i-ый ключ
  177.     }
  178.  
  179.     Node* curr = &tree[0]; // curr указывает на верш с макс ключом  с которой будем начинать поиск
  180.     int idx_left = 0, idx_right = 0;
  181.     f(0, tree, n, &idx_left, &idx_right);
  182.  
  183.     for (int i = 0; i < n; ++i)
  184.     {
  185.         cout << "i= " << tree[i].key << ": ";
  186.         if (tree[i].left != NULL)
  187.             cout << tree[i].left->key << " ";
  188.         if (tree[i].right != NULL)
  189.             cout << tree[i].right->key << " ;";
  190.         cout << endl;
  191.            
  192.     }
  193.     cout << endl;
  194.    
  195.     cout << "preoder " << endl;
  196.     preorderTraversal(&tree[0]);
  197.     return 0;
  198. }
  199.  
Add Comment
Please, Sign In to add comment