Advertisement
vadimk772336

Untitled

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