vadimk772336

без принтов улучшено

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