Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <locale.h>
  5. #include <ctime>
  6. #include <iostream>
  7.  
  8. using namespace std;
  9.  
  10. struct vertex {
  11. int data;
  12. int balance;
  13. vertex* left;
  14. vertex* right;
  15. };
  16.  
  17.  
  18. vertex* root;
  19. vertex* root2;
  20. int ymen;
  21. int rost;
  22. int raz, sum, vismax;
  23.  
  24. int VR = 1;
  25. int HR = 1;
  26.  
  27. int tree_size(vertex* p, int size = 0)
  28. {
  29. if (p == NULL)
  30. return size;
  31. else {
  32. size = tree_size(p->left) + tree_size(p->right) + 1;
  33. }
  34. return size;
  35. }
  36.  
  37. int summa(vertex* p)
  38. {
  39. if (p == NULL)
  40. sum = 0;
  41. else
  42. sum = p->data + summa(p->left) + summa(p->right);
  43. }
  44.  
  45. int max(int a, int b)
  46. {
  47. if (a > b)
  48. return a;
  49. else
  50. return b;
  51. }
  52.  
  53. int tree_height(vertex* p, int height = 0)
  54. {
  55. if (p == NULL)
  56. return height;
  57. else
  58. height = 1 + max(tree_height(p->left, height), tree_height(p->right, height));
  59. return height;
  60. }
  61.  
  62. int tree_len_sum(vertex* p, int level = 0)
  63. {
  64. int len_sum = 0;
  65. if (p == 0)
  66. return len_sum;
  67. else
  68. len_sum = level + tree_len_sum(p->left, level + 1) + tree_len_sum(p->right, level + 1);
  69. return len_sum;
  70. }
  71.  
  72. double medium_tree_height(vertex* root)
  73. {
  74. return (double)tree_len_sum(root, 1) / tree_size(root);
  75. }
  76.  
  77. void random(int A[], int N)
  78. {
  79. srand(time(NULL));
  80. int i;
  81. for (i = 0; i < N; i++)
  82. A[i] = i;
  83.  
  84. for (i = N - 1; i >= 1; i--) {
  85. int j = rand() % (i + 1);
  86.  
  87. int tmp = A[j];
  88. A[j] = A[i];
  89. A[i] = tmp;
  90. }
  91. }
  92.  
  93. void vivod(int A[], int N)
  94. {
  95. for (int i = 0; i < N; i++)
  96. printf("%d ", A[i]);
  97. }
  98.  
  99. void obhod(vertex* p)
  100. {
  101. if (p != NULL) {
  102. obhod(p->left);
  103. cout << p -> data << " ";
  104. obhod(p->right);
  105. }
  106. }
  107. void LL(vertex*& p)
  108. {
  109. vertex* q;
  110. q = p->left;
  111. q->balance = 0;
  112. p->balance = 0;
  113. p->left = q->right;
  114. q->right = p;
  115. p = q;
  116. }
  117.  
  118. void LR(vertex*& p)
  119. {
  120. vertex *q, *r;
  121. q = p->left;
  122. r = q->right;
  123. if (r->balance < 0)
  124. p->balance = 1;
  125. else
  126. p->balance = 0;
  127. if (r->balance > 0)
  128. q->balance = -1;
  129. else
  130. q->balance = 0;
  131. r->balance = 0;
  132. q->right = r->left;
  133. p->left = r->right;
  134. r->left = q;
  135. r->right = p;
  136. p = r;
  137. }
  138. void RR(vertex*& p)
  139. {
  140. vertex* q;
  141. q = p->right;
  142. q->balance = 0;
  143. p->balance = 0;
  144. p->right = q->left;
  145. q->left = p;
  146. p = q;
  147. }
  148.  
  149. void RL(vertex*& p)
  150. {
  151. vertex *r, *q;
  152. q = p->right;
  153. r = q->left;
  154. if (r->balance > 0)
  155. p->balance = -1;
  156. else
  157. p->balance = 0;
  158. if (r->balance < 0)
  159. q->balance = 1;
  160. else
  161. q->balance = 0;
  162. r->balance = 0;
  163. q->left = r->right;
  164. p->right = r->left;
  165. r->right = q;
  166. r->left = p;
  167. p = r;
  168. }
  169.  
  170. void AVL(int D, vertex*& p)
  171. {
  172.  
  173. if (p == NULL) {
  174. p = new vertex;
  175. p->data = D;
  176. p->left = NULL;
  177. p->right = NULL;
  178. p->balance = 0;
  179. rost = 1;
  180. }
  181. else if (p->data > D) {
  182. AVL(D, p->left);
  183. if (rost == 1) {
  184. if (p->balance > 0) {
  185. p->balance = 0;
  186. rost = 0;
  187. }
  188. else if (p->balance == 0) {
  189. p->balance = -1;
  190. }
  191. else if (p->left->balance < 0) {
  192. LL(p);
  193. rost = 0;
  194. }
  195. else {
  196. LR(p);
  197. rost = 0;
  198. }
  199. }
  200. }
  201. else if (p->data < D) {
  202. AVL(D, p->right);
  203. if (rost == 1) {
  204. if (p->balance < 0) {
  205. p->balance = 0;
  206. rost = 0;
  207. }
  208. else if (p->balance == 0) {
  209. p->balance = 1;
  210. }
  211. else if (p->right->balance > 0) {
  212. RR(p);
  213. rost = 0;
  214. }
  215. else {
  216. RL(p);
  217. rost = 0;
  218. }
  219. }
  220. }
  221. }
  222.  
  223. void LL1(vertex*& p)
  224. {
  225. vertex* q;
  226. q = p->left;
  227. if (q->balance == 0) {
  228. q->balance = 1;
  229. p->balance = -1;
  230. ymen = 0;
  231. }
  232. else {
  233. q->balance = 0;
  234. p->balance = 0;
  235. }
  236. p->left = q->right;
  237. q->right = p;
  238. p = q;
  239. }
  240.  
  241. void RR1(vertex*& p)
  242. {
  243. vertex* q;
  244. q = p->right;
  245. if (q->balance == 0) {
  246. q->balance = -1;
  247. p->balance = 1;
  248. ymen = 0;
  249. }
  250. else {
  251. q->balance = 0;
  252. p->balance = 0;
  253. }
  254. p->right = q->left;
  255. q->left = p;
  256. p = q;
  257. }
  258. void BL(vertex*& p)
  259. {
  260. if (p->balance == -1)
  261. p->balance = 0;
  262. else if (p->balance == 0) {
  263. p->balance = 1;
  264. ymen = 0;
  265. }
  266. else if (p->right->balance >= 0)
  267. RR1(p);
  268. else
  269. RL(p);
  270. }
  271.  
  272. void BR(vertex*& p)
  273. {
  274. if (p->balance == 1)
  275. p->balance = 0;
  276. else if (p->balance == 0) {
  277. p->balance = -1;
  278. ymen = 0;
  279. }
  280. else if (p->left->balance <= 0)
  281. LL1(p);
  282. else
  283. LR(p);
  284. }
  285.  
  286. void del(vertex*& r, vertex*& q)
  287. {
  288. if (r->right != NULL) {
  289. del(r->right, q);
  290. if (ymen)
  291. BR(r);
  292. }
  293. else {
  294. q->data = r->data;
  295. q = r;
  296. r = r->left;
  297. // delete (q);
  298. ymen = 1;
  299. }
  300. }
  301.  
  302. void del_AVL(int D, vertex*& p)
  303. {
  304. vertex* q;
  305. if (p == NULL) {
  306. ymen = 0;
  307. }
  308. else {
  309. if (D < p->data) {
  310. del_AVL(D, p->left);
  311. if (ymen)
  312. BL(p);
  313. }
  314. else {
  315. if (D > p->data) {
  316. del_AVL(D, p->right);
  317. if (ymen)
  318. BR(p);
  319. }
  320. else {
  321. q = p;
  322. if (q->left == NULL) {
  323. p = q->right;
  324. ymen = 1;
  325. }
  326. else if (q->right == NULL) {
  327. p = q->left;
  328. ymen = 1;
  329. }
  330. else {
  331. del(q->left, q);
  332. if (ymen)
  333. BL(p);
  334. }
  335. delete (q);
  336. }
  337. }
  338. }
  339. }
  340.  
  341. void b2insert(int D, vertex *&p)
  342. {
  343. vertex *q;
  344. if (p == NULL){
  345. p = new vertex;
  346. p -> data = D;
  347. p -> left = p -> right = NULL;
  348. p -> balance = 0;
  349. VR = 1;
  350. } else if (p -> data > D) {
  351. b2insert(D, p -> left);
  352. if (VR == 1){
  353. if (p -> balance == 0){
  354. q = p -> left;
  355. p -> left = q -> right;
  356. q -> right = p;
  357. p = q;
  358. q -> balance = 1;
  359. VR = 0;
  360. HR = 1;
  361. } else {
  362. p -> balance = 0;
  363. VR = 1;
  364. HR = 0;
  365. }
  366. } else {
  367. HR = 0;
  368. }
  369. } else if(p -> data < D){
  370. b2insert(D, p -> right);
  371. if (VR == 1){
  372. p -> balance = 1;
  373. HR = 1;
  374. VR = 0;
  375. } else if (HR == 1){
  376. if (p -> balance == 1){
  377. q = p -> right;
  378. p -> balance = 0;
  379. q -> balance = 0;
  380. p -> right = q -> left;
  381. q -> left = p;
  382. q = p;
  383. VR = 1;
  384. HR = 0;
  385. } else {
  386. HR = 0;
  387. }
  388. }
  389. }
  390. }
  391.  
  392. int main()
  393. {
  394. int *A, N = 100, w;
  395. A = new int[N];
  396. random(A, N);
  397. root = NULL;
  398. root2 = NULL;
  399. for (int i = 0; i < N; i++) {
  400. // AVL(A[i], root);
  401. cout << A[i] << " ";
  402. b2insert(A[i], root2);
  403. }
  404. cout << "---" << endl;
  405. obhod(root2);
  406. system("pause");
  407. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement