Advertisement
vadimk772336

Untitled

Nov 20th, 2021 (edited)
446
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.46 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Node
  5. {
  6.     int key; // ключ узла
  7.     Node* left; // указатель на левого потомка
  8.     Node* right; // указатель на правого потомка
  9.     Node* parent; // указатель на предка
  10. };
  11.  
  12. /*
  13. Первая вершина всегда будет в корне. Затем, пока не будут использованы все значения,
  14. будем последовательно подвешивать левых сыновей к последней добавленной вершине, пока не найдём
  15. номер,
  16. нарушающий убывающую последовательность,
  17.  
  18. а для каждого такого номера будем искать вершину без правого потомка,
  19. хранящую наибольшее значение, не превосходящее того, которое хотим поставить, и подвешиваем к ней
  20. элемент
  21. с таким номером в качестве правого сына.
  22.  
  23. Когда мы, желая найти такую вершину, встречаем какую-нибудь другую,
  24. уже имеющую правого сына, проходим по ветке вправо. Мы имеем на это право, так как если такая
  25. вершина стоит,
  26. то процедура обхода в ней уже побывала и поворачивала вправо, поэтому спускаться в другую сторону
  27. смысла не имеет.
  28.  
  29. Вершину с максимальным ключом, с которой будем начинать поиск, будем запоминать. Она будет
  30. обновляться каждый раз,
  31. когда появится новый максимум.
  32. */
  33.  
  34. Node* find_parent(Node* curr, int idx, Node* tree)
  35. {
  36.     if (curr->key <= tree[idx].key && curr->right == NULL)
  37.     {
  38.         tree[idx].parent = curr;
  39.         curr->right = &tree[idx];
  40.  
  41.         curr = &tree[idx];
  42.  
  43.         return curr;
  44.     }
  45.  
  46.     if (curr->right != NULL)
  47.     {
  48.         find_parent(curr->right, idx, tree);
  49.     }
  50.  
  51.     return curr;
  52. }
  53.  
  54. void f(int k, Node* tree, int n, Node* curr)
  55. {
  56.     while (k < n - 1 && tree[k + 1].key <= tree[k].key) //<= ?
  57.     {
  58.         tree[k].left = &tree[k + 1];
  59.         tree[k + 1].parent = &tree[k];
  60.         k++;
  61.     }
  62.  
  63.     curr = find_parent(curr, k + 1, tree); //Обновляем вершину с макс ключом
  64.  
  65.     if (k + 2 <= n - 1) //Если посмотрели еще не все вершины то запускаем
  66.         f(k + 2, tree, n, curr);
  67. }
  68.  
  69. void preorderTraversal(Node* x)
  70. {
  71.     if (x != NULL)
  72.     {
  73.         cout << x->key << endl;
  74.         preorderTraversal(x->left);
  75.         preorderTraversal(x->right);
  76.     }
  77.     return;
  78. }
  79.  
  80. int main()
  81. {
  82.     int n;
  83.     cin >> n;
  84.  
  85.     Node tree[n];
  86.     for (int i = 0; i < n; ++i)
  87.     {
  88.         tree[i].right = NULL;
  89.         tree[i].left = NULL;
  90.         tree[i].parent = NULL;
  91.         cin >> tree[i].key; //Массив вершин, в i-ой вершине i-ый ключ
  92.     }
  93.  
  94.     Node* curr = &tree[0]; // curr указывает на верш с макс ключом  с которой будем начинать поиск
  95.  
  96.     f(0, tree, n, curr);
  97.     preorderTraversal(&tree[0]);
  98.     return 0;
  99. }
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement