vadimk772336

починил работает

Nov 22nd, 2021
1,026
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.74 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. void find_parent(
  14.     int idx_left, int idx_right, int idx, Node* tree, int max_l, int max_r, int* l, int* r)
  15. {
  16.  
  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.  
  27.         cout << " parent finded " << endl;
  28.         if (is_greater & tree[idx].key > max_r)
  29.         {
  30.             *r = idx;
  31.             std::cout << "new max right =" << tree[idx].key << std::endl;
  32.         }
  33.         if (!is_greater & tree[idx].key > max_l)
  34.         {
  35.             std::cout << "old max left =" << max_l << " ";
  36.             *l = idx;
  37.             std::cout << ", new max left =" << tree[idx].key << "idx = " << idx << std::endl;
  38.         }
  39.     }
  40.  
  41.     else if (curr->key > tree[idx].key)
  42.     {
  43.         is_greater ? idx_right = tree[idx_right].left->idx : idx_left = tree[idx_left].left->idx;
  44.         find_parent(idx_left, idx_right, idx, tree, max_l, max_r, l, r);
  45.     }
  46.  
  47.     else if (curr->right != NULL)
  48.     {
  49.         is_greater ? idx_right = tree[idx_right].right->idx : idx_left = tree[idx_left].right->idx;
  50.         find_parent(idx_left, idx_right, idx, tree, max_l, max_r, l, r);
  51.     }
  52.  
  53.     return;
  54. }
  55.  
  56.  
  57. void f(int* idx_left, int* idx_right, int k, Node* tree, int n)
  58. {
  59.  
  60.     int max_l, max_r;
  61.  
  62.     (*idx_left == 0) ? max_l = -1 : max_l = tree[*idx_left].key;
  63.     (*idx_right == 0) ? max_r = -1 : max_r = tree[*idx_right].key;
  64.  
  65.     cout << "Вызов от " << tree[k].key << endl;
  66.     std::cout << "max left =" << max_l << " idx = " << *idx_left << " ";
  67.     std::cout << "max right =" << max_r << " ";
  68.     cout << endl;
  69.  
  70.     while (k < n - 1 & tree[k + 1].key < tree[k].key)
  71.     {
  72.         tree[k].left = &tree[k + 1];
  73.         tree[k + 1].parent = &tree[k];
  74.         k++;
  75.     }
  76.  
  77.     //либо k = n-1, то есть осталась одна вершина - ничего не надо делать
  78.     //либо k+1 -ый нарушает убывание - вызвать функцию поиска родителя
  79.     //либо и то и то
  80.  
  81.     if (k + 1 < n)
  82.     {
  83.         cout << "Сейчас запущу поиск родителя для " << tree[k + 1].key << endl;
  84.         std::cout << "до запуска max left =" << max_l << " idx = " << *idx_left << " ";
  85.         std::cout << "до запуска max right =" << max_r << " ";
  86.         cout << endl;
  87.         find_parent(*idx_left, *idx_right, k + 1, tree, max_l, max_r, idx_left, idx_right);
  88.     }
  89.     //После вставки нарушителя (k+1-го) могут остаться еще вершины и надо запустить снова с k+1-го
  90.     if (k + 2 < n)
  91.     {
  92.         cout << "Ещё не конец, запущу от  " << tree[k + 1].key << endl;
  93.         std::cout << "до запуска max left =" << max_l << " idx = " << *idx_left << " ";
  94.         std::cout << "до запуска max right =" << max_r << " ";
  95.         cout << endl;
  96.         f(idx_left, idx_right, k + 1, tree, n);
  97.     }
  98. }
  99.  
  100. void preorderTraversal(Node* x)
  101. {
  102.     if (x != NULL)
  103.     {
  104.         std::cout << x->key << " ";
  105.         preorderTraversal(x->left);
  106.         preorderTraversal(x->right);
  107.     }
  108.     return;
  109. }
  110.  
  111. void inorderTraversal(Node* x)
  112. {
  113.     if (x != NULL)
  114.     {
  115.         inorderTraversal(x->left);
  116.         std::cout << x->key << " ";
  117.         inorderTraversal(x->right);
  118.     }
  119.     return;
  120. }
  121.  
  122. void postorderTraversal(Node* x)
  123. {
  124.     if (x != NULL)
  125.     {
  126.         postorderTraversal(x->left);
  127.         postorderTraversal(x->right);
  128.         std::cout << x->key << " ";
  129.     }
  130.     return;
  131. }
  132.  
  133. void print_tree(Node* tree, int n)
  134. {
  135.     std::cout << std::endl;
  136.     for (int i = 0; i < n; ++i)
  137.     {
  138.         std::cout << "i= " << tree[i].key << ": ";
  139.         if (tree[i].left != NULL)
  140.             std::cout << tree[i].left->key << " ";
  141.         if (tree[i].right != NULL)
  142.             std::cout << tree[i].right->key << " ;";
  143.         std::cout << std::endl;
  144.     }
  145.     std::cout << std::endl;
  146. }
  147.  
  148. int main()
  149. {
  150.     int n;
  151.     std::cin >> n;
  152.  
  153.     int idx_left = 0, idx_right = 0;
  154.     Node tree[n];
  155.  
  156.     for (int i = 0; i < n; ++i)
  157.     {
  158.         tree[i].right = NULL;
  159.         tree[i].left = NULL;
  160.         tree[i].parent = NULL;
  161.         tree[i].idx = i;
  162.         std::cin >> tree[i].key;
  163.     }
  164.  
  165.  
  166.     f(&idx_left, &idx_right, 0, tree, n);
  167.  
  168.     print_tree(tree, n);
  169.     postorderTraversal(&tree[0]);
  170.     std::cout << std::endl;
  171.     inorderTraversal(&tree[0]);
  172.  
  173.     return 0;
  174. }
  175.  
Advertisement
Add Comment
Please, Sign In to add comment