vadimk772336

WA10 (попробовал переставить)

Nov 20th, 2021
1,459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 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->right != NULL)
  23.     {
  24.         is_greater ? * r = tree[idx_right].right->idx : * l = tree[idx_left].right->idx;
  25.         find_parent(l, r, idx, tree);
  26.     }
  27.  
  28.     else if (curr->key <= tree[idx].key && curr->right == NULL)
  29.     {
  30.         tree[idx].parent = curr;
  31.         curr->right = &tree[idx];
  32.         is_greater ? * r = idx : * l = idx;
  33.     }
  34.  
  35.     else if (curr->key > tree[idx].key)
  36.     {
  37.         is_greater ? * r = tree[idx_right].left->idx : * l = tree[idx_left].left->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.     if (k + 1 < n)
  56.         find_parent(idx_left, idx_right, k + 1, tree);
  57.  
  58.     if (k + 2 < n)
  59.         f(idx_left, idx_right, k + 1, tree, n);
  60. }
  61.  
  62. void preorderTraversal(Node* x)
  63. {
  64.     if (x != NULL)
  65.     {
  66.         std::cout << x->key << " ";
  67.         preorderTraversal(x->left);
  68.         preorderTraversal(x->right);
  69.     }
  70.     return;
  71. }
  72.  
  73. void inorderTraversal(Node* x)
  74. {
  75.     if (x != NULL)
  76.     {
  77.         inorderTraversal(x->left);
  78.         std::cout << x->key << " ";
  79.         inorderTraversal(x->right);
  80.     }
  81.     return;
  82. }
  83.  
  84. void postorderTraversal(Node* x)
  85. {
  86.     if (x != NULL)
  87.     {
  88.         postorderTraversal(x->left);
  89.         postorderTraversal(x->right);
  90.         std::cout << x->key << " ";
  91.     }
  92.     return;
  93. }
  94.  
  95. void print_tree(Node* tree, int n)
  96. {
  97.     std::cout << std::endl;
  98.     for (int i = 0; i < n; ++i)
  99.     {
  100.         std::cout << "i= " << tree[i].key << ": ";
  101.         if (tree[i].left != NULL)
  102.             std::cout << tree[i].left->key << " ";
  103.         if (tree[i].right != NULL)
  104.             std::cout << tree[i].right->key << " ;";
  105.         std::cout << std::endl;
  106.     }
  107.     std::cout << std::endl;
  108. }
  109.  
  110. int main()
  111. {
  112.     int n;
  113.     std::cin >> n;
  114.  
  115.     int idx_left = 0, idx_right = 0;
  116.     Node tree[n];
  117.  
  118.     for (int i = 0; i < n; ++i)
  119.     {
  120.         tree[i].right = NULL;
  121.         tree[i].left = NULL;
  122.         tree[i].parent = NULL;
  123.         tree[i].idx = i;
  124.         std::cin >> tree[i].key;
  125.     }
  126.  
  127.  
  128.     f(&idx_left, &idx_right, 0, tree, n);
  129.  
  130.  
  131.     postorderTraversal(&tree[0]);
  132.     std::cout << std::endl;
  133.     inorderTraversal(&tree[0]);
  134.  
  135.     return 0;
  136. }
  137.  
Advertisement
Add Comment
Please, Sign In to add comment