vadimk772336

WA10

Nov 20th, 2021 (edited)
1,122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct Node
  4. {
  5.     int key;
  6.     int idx;
  7.     Node* left;
  8.     Node* right;
  9.     Node* parent;
  10. };
  11.  
  12. void find_parent(int* l, int* r, int idx, Node* tree)
  13. {
  14.  
  15.     int idx_left = *l;
  16.     int idx_right = *r;
  17.     bool is_greater = tree[0].key <= tree[idx].key;
  18.     Node* curr;
  19.  
  20.     is_greater ? curr = &tree[idx_right] : curr = &tree[idx_left];
  21.  
  22.     if (curr->key <= tree[idx].key && curr->right == NULL)
  23.     {
  24.         tree[idx].parent = curr;
  25.         curr->right = &tree[idx];
  26.         is_greater ? * r = idx : * l = idx;
  27.     }
  28.     // мб поменять местами два elif??
  29.     else if (curr->key > tree[idx].key)
  30.     {
  31.         is_greater ? * r = tree[idx_right].left->idx : * l = tree[idx_left].left->idx;
  32.         find_parent(l, r, idx, tree);
  33.     }
  34.  
  35.     else if (curr->right != NULL)
  36.     {
  37.         is_greater ? * r = tree[idx_right].right->idx : * l = tree[idx_left].right->idx;
  38.         find_parent(l, r, idx, tree);
  39.     }
  40.  
  41.     return;
  42. }
  43.  
  44.  
  45. void f(int* idx_left, int* idx_right, int k, Node* tree, int n)
  46. {
  47.  
  48.     while (k < n - 1 & tree[k + 1].key < tree[k].key)
  49.     {
  50.         tree[k].left = &tree[k + 1];
  51.         tree[k + 1].parent = &tree[k];
  52.         k++;
  53.     }
  54.  
  55.     //либо k = n-1, то есть осталась одна вершина - ничего не надо делать
  56.     //либо k+1 -ый нарушает убывание - вызвать функцию поиска родителя
  57.     //либо и то и то
  58.    
  59.     if (k + 1 < n)
  60.         find_parent(idx_left, idx_right, k + 1, tree);
  61.  
  62.     //После вставки нарушителя (k+1-го) могут остаться еще вершины и надо запустить снова с k+1-го
  63.     if (k + 2 < n)
  64.         f(idx_left, idx_right, k + 1, tree, n);
  65. }
  66.  
  67. void preorderTraversal(Node* x)
  68. {
  69.     if (x != NULL)
  70.     {
  71.         std::cout << x->key << " ";
  72.         preorderTraversal(x->left);
  73.         preorderTraversal(x->right);
  74.     }
  75.     return;
  76. }
  77.  
  78. void inorderTraversal(Node* x)
  79. {
  80.     if (x != NULL)
  81.     {
  82.         inorderTraversal(x->left);
  83.         std::cout << x->key << " ";
  84.         inorderTraversal(x->right);
  85.     }
  86.     return;
  87. }
  88.  
  89. void postorderTraversal(Node* x)
  90. {
  91.     if (x != NULL)
  92.     {
  93.         postorderTraversal(x->left);
  94.         postorderTraversal(x->right);
  95.         std::cout << x->key << " ";
  96.     }
  97.     return;
  98. }
  99.  
  100. void print_tree(Node* tree, int n)
  101. {
  102.     std::cout << std::endl;
  103.     for (int i = 0; i < n; ++i)
  104.     {
  105.         std::cout << "i= " << tree[i].key << ": ";
  106.         if (tree[i].left != NULL)
  107.             std::cout << tree[i].left->key << " ";
  108.         if (tree[i].right != NULL)
  109.             std::cout << tree[i].right->key << " ;";
  110.         std::cout << std::endl;
  111.     }
  112.     std::cout << std::endl;
  113. }
  114.  
  115. int main()
  116. {
  117.     int n;
  118.     std::cin >> n;
  119.  
  120.     int idx_left = 0, idx_right = 0;
  121.     Node tree[n];
  122.  
  123.     for (int i = 0; i < n; ++i)
  124.     {
  125.         tree[i].right = NULL;
  126.         tree[i].left = NULL;
  127.         tree[i].parent = NULL;
  128.         tree[i].idx = i;
  129.         std::cin >> tree[i].key;
  130.     }
  131.  
  132.  
  133.     f(&idx_left, &idx_right, 0, tree, n);
  134.  
  135.  
  136.     postorderTraversal(&tree[0]);
  137.     std::cout << std::endl;
  138.     inorderTraversal(&tree[0]);
  139.  
  140.     return 0;
  141. }
  142.  
Advertisement
Add Comment
Please, Sign In to add comment