Advertisement
blufzzz

Fivt_Intro_3/task-3_1/26.11.2017 (TL)

Nov 26th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <cstdlib>
  5.  
  6. template <typename Data, class T>
  7. struct TreeNode {
  8. Data key;
  9. T* l;
  10. T* r;
  11. TreeNode(Data _key, T* _l, T* _r) :
  12. key(_key),
  13. l(_l),
  14. r(_r)
  15. {
  16. }
  17. };
  18.  
  19. struct AVLTreeNode : public TreeNode<int, AVLTreeNode> {
  20. size_t height;
  21. AVLTreeNode(const int _key, AVLTreeNode* _l, AVLTreeNode* _r) :
  22. TreeNode(_key,_l,_r),
  23. height(1)
  24. {
  25. }
  26. int HeightDiff() const;
  27. void CorrectHeight();
  28. };
  29.  
  30.  
  31. size_t Height(AVLTreeNode* p) {
  32. if (p == nullptr) {
  33. return 0;
  34. } else {
  35. return p->height;
  36. }
  37. }
  38.  
  39.  
  40. int AVLTreeNode::HeightDiff() const {
  41. int right_height = Height(this->r);
  42. int left_height = Height(this->l);
  43. return (right_height - left_height);
  44. }
  45.  
  46.  
  47. size_t RightOffspringsNumber(AVLTreeNode* node) {
  48. size_t node_offspring_number = 0;
  49. if (node == nullptr) {
  50. return 0;
  51. } else {
  52. ++node_offspring_number;
  53. }
  54. if (node->l != nullptr) {
  55. node_offspring_number += RightOffspringsNumber(node->l);
  56. }
  57. if (node->r != nullptr) {
  58. node_offspring_number += RightOffspringsNumber(node->r);
  59. }
  60. return node_offspring_number;
  61. }
  62.  
  63.  
  64. void AVLTreeNode::CorrectHeight() {
  65. size_t height_left = Height(this->l);
  66. size_t height_right = Height(this->r);
  67. this->height = ((height_left > height_right) ? height_left : height_right ) +1;
  68. }
  69.  
  70.  
  71. template <typename Data, class T>
  72. class Tree {
  73. private:
  74. T* root;
  75. public:
  76. virtual T* Add(T* node, int key) = 0;
  77. explicit Tree(Data root_key);
  78. T* GetRoot() const;
  79. T*& SetRoot();
  80. ~Tree();
  81. };
  82.  
  83.  
  84. template <typename Data, class T>
  85. Tree<Data,T>::Tree(Data root_key) {
  86. root = new T(root_key, nullptr, nullptr);
  87. }
  88.  
  89.  
  90. template <typename Data, class T>
  91. T *Tree<Data, T>::GetRoot() const {
  92. return root;
  93. }
  94.  
  95.  
  96. template <typename Data, class T>
  97. Tree<Data,T>::~Tree() {
  98. std::queue<T*> queue;
  99. queue.push(GetRoot());
  100. while (!queue.empty()) {
  101. T* node_from_queue = queue.front();
  102. queue.pop();
  103. if (node_from_queue->l != nullptr) {
  104. queue.push(node_from_queue->l);
  105. }
  106. if (node_from_queue->r != nullptr) {
  107. queue.push(node_from_queue->r);
  108. }
  109. delete node_from_queue;
  110. }
  111. }
  112.  
  113.  
  114. template <typename Data, class T>
  115. T*& Tree<Data,T>::SetRoot() {
  116. return root;
  117. }
  118.  
  119.  
  120. class AVLTree : public Tree<int,AVLTreeNode> {
  121. private:
  122. AVLTreeNode* SmallLeftRotation(AVLTreeNode* node);
  123. AVLTreeNode* SmallRightRotation(AVLTreeNode* node);
  124. AVLTreeNode* Balance(AVLTreeNode* node);
  125. AVLTreeNode* RemoveMin(AVLTreeNode* root);
  126. AVLTreeNode* FindMin(AVLTreeNode* root);
  127. public:
  128. explicit AVLTree(int root_key);
  129. AVLTreeNode* Add(AVLTreeNode* node, int key) override;
  130. AVLTreeNode* Delete(AVLTreeNode* node, int key);
  131. void RemoveByPosition(int position);
  132. size_t GetArrayPosition(int key);
  133. };
  134.  
  135. AVLTree::AVLTree(int root_key) :
  136. Tree(root_key)
  137. {
  138. }
  139.  
  140.  
  141. AVLTreeNode *AVLTree::SmallLeftRotation(AVLTreeNode *node) {
  142. AVLTreeNode* right_child = node->r;
  143. node->r = right_child->l;
  144. right_child->l = node;
  145. node->CorrectHeight();
  146. right_child->CorrectHeight();
  147. return right_child;
  148. }
  149.  
  150.  
  151. AVLTreeNode* AVLTree::SmallRightRotation(AVLTreeNode *node) {
  152. AVLTreeNode* left_child = node->l;
  153. node->l = left_child->r;
  154. left_child->r = node;
  155. node->CorrectHeight();
  156. left_child->CorrectHeight();
  157. return left_child;
  158. }
  159.  
  160.  
  161. AVLTreeNode* AVLTree::Balance(AVLTreeNode* node) {
  162.  
  163. node->CorrectHeight();
  164.  
  165. if (node->HeightDiff() == 2) {
  166. if (node->r->HeightDiff() < 0) {
  167. node->r = SmallRightRotation(node->r);
  168. }
  169. return SmallLeftRotation(node);
  170. }
  171.  
  172. if (node->HeightDiff() == -2) {
  173. if (node->l->HeightDiff() > 0) {
  174. node->l = SmallLeftRotation(node->l);
  175. }
  176. return SmallRightRotation(node);
  177. }
  178.  
  179. return node;
  180. }
  181.  
  182.  
  183. AVLTreeNode* AVLTree::Add(AVLTreeNode* node, const int key) {
  184. if (node == nullptr) {
  185. return new AVLTreeNode(key, nullptr, nullptr);
  186. }
  187. if (key < node->key) {
  188. node->l = Add(node->l, key);
  189. }
  190. else {
  191. node->r = Add(node->r, key);
  192. }
  193. return Balance(node);
  194. }
  195.  
  196.  
  197. AVLTreeNode* AVLTree::RemoveMin(AVLTreeNode *root) {
  198. if( root->l == nullptr ) {
  199. return root->r;
  200. }
  201. root->l = RemoveMin(root->l);
  202. root->CorrectHeight();
  203. return root;
  204. }
  205.  
  206.  
  207. AVLTreeNode* AVLTree::FindMin(AVLTreeNode *root) { // конец левой ветки
  208. if ( root->l == nullptr) {
  209. return root;
  210. } else {
  211. return FindMin(root->l);
  212. }
  213. }
  214.  
  215. AVLTreeNode* AVLTree::Delete(AVLTreeNode* node, int key) { //удаляет этот нод c key
  216. if (node == nullptr) {
  217. return nullptr;
  218. }
  219. else if (key < node->key) {
  220. node->l = Delete(node->l, key);
  221. }
  222. else if (key > node->key) {
  223. node->r = Delete(node->r, key);
  224. }
  225. else {
  226. AVLTreeNode* left_offspring = node->l;
  227. AVLTreeNode* right_offspring = node->r;
  228.  
  229. delete node;
  230.  
  231. if (right_offspring == nullptr) {
  232. return left_offspring;
  233. }
  234.  
  235. AVLTreeNode* min_in_right_subtree = FindMin(right_offspring); // находим узел с наименьшим ключом в правом поддереве
  236. min_in_right_subtree->r = RemoveMin(right_offspring); // удаление мин. ключа
  237. min_in_right_subtree->l = left_offspring;
  238.  
  239. return Balance(min_in_right_subtree);
  240. }
  241. return Balance(node);
  242. }
  243.  
  244.  
  245. void AVLTree::RemoveByPosition(int position) {
  246. AVLTreeNode* current_node = GetRoot();
  247. while (current_node != nullptr) {
  248. if (GetArrayPosition(current_node->key) == position) {
  249. this->SetRoot() = Delete(GetRoot(), current_node->key); // нашел нужный ключ
  250. return;
  251. }
  252. else {
  253. if (GetArrayPosition(current_node->key) < position) {
  254. current_node = current_node->l;
  255. } else {
  256. current_node = current_node->r;
  257. }
  258. }
  259. }
  260. std::cerr<<" Can't find this position ";
  261. exit(1);
  262. }
  263.  
  264.  
  265. size_t AVLTree::GetArrayPosition(const int key) {
  266.  
  267. AVLTreeNode* current_node = GetRoot();
  268. size_t position = 0;
  269. while (current_node->key != key) {
  270. if (key < current_node->key) {
  271. position += RightOffspringsNumber(current_node->r) + 1;
  272. current_node = current_node->l;
  273. } else if (key > current_node->key) {
  274. current_node = current_node->r;
  275. }
  276. if (current_node == nullptr) {
  277. std::cerr<<" Can't find key in AVLTree ";
  278. exit(1);
  279. }
  280. }
  281. if (current_node == GetRoot()) {
  282. return RightOffspringsNumber(current_node->r);
  283. } else {
  284. return position + RightOffspringsNumber(current_node->r);
  285. }
  286. }
  287.  
  288.  
  289. int main() {
  290.  
  291.  
  292. int n;
  293. std::cin>>n;
  294.  
  295. int instruction, value;
  296. std::cin>>instruction>>value;
  297. if (instruction != 1) {
  298. std::cerr<<"Can't create AVLTree";
  299. exit(1);
  300. }
  301. AVLTree avl_tree(value);
  302. std::vector<int> result;
  303. result.push_back(avl_tree.GetArrayPosition(value));
  304.  
  305. for (int i = 1; i < n; ++i) {
  306. std::cin>>instruction>>value;
  307. if (instruction == 1) {
  308. avl_tree.SetRoot() = avl_tree.Add(avl_tree.GetRoot(), value);
  309. result.push_back(avl_tree.GetArrayPosition(value));
  310. }
  311. else if (instruction == 2){
  312. avl_tree.RemoveByPosition(value);
  313. }
  314. else {
  315. std::cerr<<"Undefined instruction";
  316. exit(1);
  317. }
  318. }
  319.  
  320. for(auto i: result) {
  321. std::cout<<i<<'\n';
  322. }
  323.  
  324.  
  325. return 0;
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement