Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.84 KB | None | 0 0
  1. # include <cstdio>
  2. # include <cmath>
  3. # include <iostream>
  4. # include <vector>
  5. # include <algorithm>
  6. # include <cstdlib>
  7. # include <string>
  8. # include <stack>
  9. using namespace std;
  10.  
  11. template < typename T >
  12.  
  13. class AVL {
  14. public:
  15. struct Node {
  16. T key;
  17. int height;
  18. Node *left;
  19. Node *right;
  20. Node(T k) {
  21. key = k;
  22. left = NULL;
  23. right = NULL;
  24. height = 1;
  25. }
  26. };
  27. private:
  28. Node* root;
  29. vector <Node*> tree;
  30. int height(Node* v);
  31. int balanceHeight (Node* v);
  32. void fixHeight (Node* v);
  33. Node* RotateRight (Node* v);
  34. Node* RotateLeft (Node* v);
  35. Node* balance(Node* v);
  36. Node* FindMin(Node* v);
  37. Node* FindMax(Node* v);
  38. Node* erase_min(Node* v);
  39. Node* _erase(Node* v, const T& k);
  40. Node* findParents(Node* v, Node* w);
  41. public:
  42.  
  43. AVL()
  44. {
  45. root = NULL;
  46. };
  47. void insert(const T& k);
  48. Node* _insert(Node* v, const T& k);
  49. void erase(const T& k);
  50. Node* get_next(Node* p);
  51. Node* get_previous(Node* p);
  52. Node* get_root();
  53. };
  54.  
  55. template < typename T >
  56. int AVL<T>::height(Node* v){
  57. return v ? v->height : 0;
  58. }
  59.  
  60. template < typename T >
  61. int AVL<T>::balanceHeight (Node* v){
  62. return height(v->right) - height(v->left);
  63. }
  64.  
  65. template < typename T >
  66. void AVL<T>::fixHeight(Node *v) {
  67. int hl = height(v->left);
  68. int hr = height(v->right);
  69. v->height = max(hl, hr) + 1;
  70. }
  71.  
  72. template < typename T >
  73. typename AVL<T>::Node* AVL<T>::RotateRight(Node *v) {
  74. Node* a = v->left;
  75. v->left = a->right;
  76. a->right = v;
  77. fixHeight(v);
  78. fixHeight(a);
  79. return a;
  80. }
  81.  
  82. template < typename T >
  83. typename AVL<T>::Node* AVL<T>::RotateLeft(Node *v) {
  84. Node* a = v->right;
  85. v->right = a->left;
  86. a->left = v;
  87. fixHeight(v);
  88. fixHeight(a);
  89. return a;
  90. }
  91.  
  92. template < typename T >
  93. typename AVL<T>::Node* AVL<T>::balance(Node *v) {
  94. fixheight(v);
  95. if(balanceHeight(v) == 2){
  96. if( balanceHeight(v->right) < 0 )
  97. v->right = RotateRight(v->right);
  98. return RotateLeft(v);
  99. }
  100. if(balanceHeight()(v) == -2){
  101. if(balanceHeight()(v->left) < 0 )
  102. v->left = RotateLeft(v->left);
  103. return RotateRight(v);
  104. }
  105. return v;
  106. }
  107.  
  108. template < typename T >
  109. typename AVL<T>::Node* AVL<T>::_insert(Node *v, const T& k) {
  110. if(!root) {
  111. root = new Node(k);
  112. return root;
  113. }
  114. if(!v)
  115. return new Node(k);
  116. if(k < v->key)
  117. v->left = _insert(v->left, k);
  118. else
  119. v->right = _insert(v->right, k);
  120. return balance(v);
  121. }
  122.  
  123. template < typename T >
  124. void AVL<T>::insert(const T& k) {
  125. if(!root) {
  126. root = new Node(k);
  127. return;
  128. }
  129. if(k < root->key)
  130. root->left = _insert(root->left, k);
  131. else
  132. root->right = _insert(root->right, k);
  133. balance(root);
  134. }
  135.  
  136. template < typename T >
  137. typename AVL<T>::Node* AVL<T>::FindMin(Node* v){
  138. if (v->left) return FindMin(v->left);
  139. else return v;
  140. }
  141.  
  142. template < typename T >
  143. typename AVL<T>::Node* AVL<T>::FindMax(Node* v){
  144. if (v->right) return FindMin(v->right);
  145. else return v;
  146. }
  147.  
  148. template < typename T >
  149. typename AVL<T>::Node* AVL<T>::erase_min(Node* v) {
  150. if(v->left == 0)
  151. return v->right;
  152. v->left = erase_min(v->left);
  153. return balance(v);
  154. }
  155.  
  156. template < typename T >
  157. typename AVL<T>::Node* AVL<T>::_erase(Node *v, const T& k) {
  158. if(!v) return 0;
  159. if(k < v->key)
  160. v->left = _erase(v->left, k);
  161. if(v->key < k)
  162. v->right = _erase(v->right, k);
  163. if(k == v->key){
  164. Node* l = v->left;
  165. Node* r = v->right;
  166. delete v;
  167. if(!r) return l;
  168. Node* min = FindMin(r);
  169. min->right = erase_min(r);
  170. min->left = l;
  171. return balance(min);
  172. }
  173. return balance(v);
  174. }
  175.  
  176. template < typename T >
  177. void AVL<T>::erase(const T& k) {
  178. if(!root) {
  179. if (k < root->key)
  180. root->left = _erase(root->left, k);
  181. if (root->key < k)
  182. root->right = _erase(root->right, k);
  183. if (k == root->key) {
  184. Node *l = root->left;
  185. Node *r = root->right;
  186. delete root;
  187. if (r == NULL) {
  188. root = l;
  189. return;
  190. }
  191. if (l == NULL) {
  192. root = r;
  193. return;
  194. }
  195. Node *min = FindMin(r);
  196. min->right = erase_min(r);
  197. min->left = l;
  198. root = min;
  199. balance(root);
  200. }
  201. balance(root);
  202. }
  203. else
  204. root = NULL;
  205. }
  206.  
  207. template < typename T >
  208. typename AVL<T>::Node* AVL<T>::get_next(Node *v) {
  209. if( v->right != NULL )
  210. return FindMin(v->right);
  211. else {
  212. findParents(v, root);
  213. if(!tree.empty()) {
  214. for (int i = tree.size() - 1; i >= 0; --i) {
  215. if (tree[i]->right) {
  216. if (i == tree.size() - 1) {
  217. if (tree[i]->right == v)
  218. continue;
  219. }
  220. if (tree[i]->right == tree[i + 1])
  221. continue;
  222. return FindMin(tree[i]->right );
  223. }else{
  224. if( v->key < tree[i]->key)
  225. return tree[i];
  226. }
  227. }
  228. }
  229. return NULL;
  230. }
  231. }
  232.  
  233. template < typename T >
  234. typename AVL<T>::Node* AVL<T>::get_previous(Node *v) {
  235. if( v->left != NULL )
  236. return FindMax(v->left);
  237. else {
  238. Node* parent = findParents(v, root);
  239. if(!tree.empty()) {
  240. for (int i = tree.size() - 1; i >= 0; i--) {
  241. if (tree[i]->left) {
  242. if (i == tree.size() - 1) {
  243. if (tree[i]->left == v)
  244. continue;
  245. }
  246. if (tree[i]->left == tree[i + 1])
  247. continue;
  248. return FindMax(tree[i]->left);
  249. }else{
  250. if(tree[i]->key < v->key)
  251. return tree[i];
  252. }
  253. }
  254. }
  255. return NULL;
  256. }
  257. }
  258.  
  259. template < typename T >
  260. typename AVL<T>::Node* AVL<T>::get_root() {
  261. return root;
  262. }
  263.  
  264. template < typename T >
  265. typename AVL<T>::Node* AVL<T>::findParents(Node *v, Node *w) {
  266. if(w == root)
  267. tree.clear();
  268. while(v != w){
  269. tree.push_back(w);
  270. if(v->key < w->key)
  271. w = w->left;
  272. else
  273. w = w->right;
  274. }
  275. }
  276.  
  277.  
  278. int main ()
  279. {
  280. int n;
  281. cin >> n;
  282. vector <int> a (n);
  283. for (int i = 0; i < n; i++)
  284. cin >> a[i];
  285.  
  286. AVL<int> Katya();
  287. for (int i = 0; i < n; i++)
  288. Katya.insert(a[i]);//Dima odobril
  289.  
  290.  
  291.  
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement