Advertisement
ElooEminem

Untitled

Apr 3rd, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <fstream>
  6. using namespace std;
  7.  
  8. struct node{
  9. int val;
  10. int bf;
  11. node *left;
  12. node *right;
  13. node *up;
  14. };
  15.  
  16. void dfs_inorder(node *tree){
  17. if(tree){
  18. dfs_inorder(tree->left);
  19. cout<<endl<<tree->val;
  20. dfs_inorder(tree->right);
  21. }
  22. return;
  23. }
  24.  
  25. void dfs_preorder(node *tree){
  26. if(tree){
  27. cout<<endl<<tree->val;
  28. dfs_preorder(tree->left);
  29. dfs_preorder(tree->right);
  30. }
  31. return;
  32. }
  33.  
  34. void dfs_postorder(node *tree){
  35. if(tree){
  36. dfs_postorder(tree->left);
  37. dfs_postorder(tree->right);
  38. delete tree;
  39. }
  40. }
  41.  
  42. void lr(node *&root,node *A){
  43. node *B=A->left;
  44. node *C=B->right;
  45. node *D=A->up;
  46. B->right=C->left;
  47. if(B->right) B->right->up=B;
  48. A->left=C->right;
  49. if(A->left) A->left->up = A;
  50. C->right = A;
  51. C->left = B;
  52. A->up=B->up=C;
  53. C->up=D;
  54. if(D){
  55. if(D->left == A) D->left = C;
  56. else D->right = C;
  57. }
  58. else root=C;
  59. if(C->bf==1) A->bf=-1;
  60. else A->bf=0;
  61. if(C->bf==-1) B->bf=1;
  62. else B->bf = 0;
  63. C->bf = 0;
  64. return;
  65. }
  66.  
  67. void ll(node *&root,node *A){
  68. node *B=A->left;
  69. node *C=A->up;
  70. A->left=B->right;
  71. if(A->left) A->left->up=A;
  72. B->right=A;
  73. B->up=C;
  74. A->up=B;
  75. if(C){
  76. if(C->left==A) C->left=B;
  77. else C->right=B;
  78. }
  79. else root=B;
  80. if(B->bf==1) A->bf=B->bf=0;
  81. else{
  82. A->bf=1;
  83. B->bf=-1;
  84. }
  85. return;
  86. }
  87.  
  88. void rl(struct node *&root,struct node *A){
  89. node *B=A->right;
  90. node *C=B->left;
  91. node *D=A->up;
  92. B->left=C->right;
  93. if(B->left) B->left->up=B;
  94. A->right=C->left;
  95. if(A->right) A->right->up=A;
  96. C->left=A;
  97. C->right=B;
  98. A->up=B->up=C;
  99. C->up=D;
  100. if(D){
  101. if(D->left==A) D->left=C;
  102. else D->right=C;
  103. }
  104. else root=C;
  105. if(C->bf==-1) A->bf=1;
  106. else A->bf=0;
  107. if(C->bf==1) B->bf=-1;
  108. else B->bf=0;
  109. C->bf = 0;
  110. return;
  111. }
  112.  
  113. void rr(struct node *&root,struct node *A){
  114. node *B=A->right;
  115. node *C=A->up;
  116. A->right=B->left;
  117. if(A->right) A->right->up=A;
  118. B->left=A;
  119. B->up=C;
  120. A->up=B;
  121. if(C){
  122. if(C->left==A) C->left=B;
  123. else C->right=B;
  124. }
  125. else root=B;
  126. if(B->bf==-1) A->bf=B->bf=0;
  127. else{
  128. A->bf=-1;
  129. B->bf=1;
  130. }
  131. return;
  132. }
  133.  
  134. node *node_find(node *elem,int b){
  135. cout<<"Sciezka do elementu "<<b<<" ...";;
  136. while((elem)&&(elem->val!=b)){
  137. cout<<endl<<elem->val;
  138. if(b>=elem->val) elem=elem->right;
  139. else elem=elem->left;
  140. }
  141. return elem;
  142. }
  143.  
  144. node *node_find_prim(node *elem,int b){
  145. while((elem)&&(elem->val!=b)){
  146. if(b>=elem->val) elem=elem->right;
  147. else elem=elem->left;
  148. }
  149. return elem;
  150. }
  151.  
  152. node *node_up(node *elem){
  153. node *tmp;
  154. if(elem){
  155. if(elem->left){
  156. elem=elem->left;
  157. while(elem->right) elem=elem->right;
  158. }
  159. else
  160. do{
  161. tmp=elem;
  162. elem=elem->up;
  163. }while((elem)&&(elem->right!=tmp));
  164. }
  165. return elem;
  166. }
  167.  
  168. node *node_erase(node *&root,node *del){
  169. node *tmp;
  170. node *del1;
  171. node *del2;
  172. bool cor;
  173. if(del->left && del->right){
  174. del1=node_erase(root,node_up(del));
  175. cor=false;
  176. }
  177. else{
  178. if(del->left){
  179. del1=del->left;
  180. del->left=NULL;
  181. }
  182. else{
  183. del1=del->right;
  184. del->right=NULL;
  185. }
  186. del->bf=0;
  187. cor=true;
  188. }
  189. if(del1){
  190. del1->up=del->up;
  191. del1->left=del->left;
  192. if(del1->left) del1->left->up=del1;
  193. del1->right=del->right;
  194. if(del1->right) del1->right->up=del1;
  195. del1->bf=del->bf;
  196. }
  197. if(del->up){
  198. if(del->up->left==del) del->up->left=del1;
  199. else del->up->right=del1;
  200. }
  201. else root=del1;
  202. if(cor){
  203. del2=del1;
  204. del1=del->up;
  205. while(del1){
  206. if(!del1->bf){
  207. if(del1->left==del2) del1->bf=-1;
  208. else del1->bf = 1;
  209. break;
  210. }
  211. else{
  212. if(((del1->bf==1) && (del1->left==del2)) || ((del1->bf==-1) && (del1->right==del2))){
  213. del1->bf=0;
  214. del2=del1;
  215. del1=del1->up;
  216. }
  217. else{
  218. if(del1->left==del2) tmp = del1->right;
  219. else tmp = del1->left;
  220. if(!tmp->bf){
  221. if(del1->bf==1) ll(root,del1);
  222. else rr(root,del1);
  223. break;
  224. }
  225. else if(del1->bf==tmp->bf){
  226. if(del1->bf==1) ll(root,del1);
  227. else rr(root,del1);
  228. del2=tmp;
  229. del1=tmp->up;
  230. }
  231. else{
  232. if(del1->bf==1) lr(root,del1);
  233. else rl(root,del1);
  234. del2=del1->up;
  235. del1=del2->up;
  236. }
  237. }
  238. }
  239. }
  240. }
  241. return del;
  242. }
  243.  
  244. node *node_add(struct node *&tree,int b){
  245. if(tree) while(tree->up) tree=tree->up;
  246. struct node *add=new struct node;
  247. add->val=b;
  248. add->left=NULL;
  249. add->right=NULL;
  250. add->bf=0;
  251. struct node *tmp;
  252. struct node *root=tree;
  253. bool t;
  254. if(tree==NULL){
  255. tree=new struct node;
  256. tree->left=NULL;
  257. tree->right=NULL;
  258. tree->up=NULL;
  259. tree->val=b;
  260. return tree;
  261. }
  262. while(true){
  263. if(b>=tree->val){
  264. if(tree->right==NULL){
  265. tree->right=add;
  266. add->up=tree;
  267. break;
  268. }
  269. else tree=tree->right;
  270. }
  271. else{
  272. if(tree->left==NULL){
  273. tree->left=add;
  274. add->up=tree;
  275. break;
  276. }
  277. else tree=tree->left;
  278. }
  279. }
  280. if(tree->bf) tree->bf=0;
  281. else{
  282. if(tree->left==add) tree->bf=1;
  283. else tree->bf=-1;
  284. tmp=tree->up;
  285. t=false;
  286. while(tmp){
  287. if(tmp->bf){
  288. t=true;
  289. break;
  290. }
  291. if(tmp->left==tree) tmp->bf=1;
  292. else tmp->bf=-1;
  293.  
  294. tree=tmp;
  295. tmp=tmp->up;
  296. }
  297. if(t){
  298. if(tmp->bf==1){
  299. if(tmp->right==tree) tmp->bf=0;
  300. else if(tree->bf==-1) lr(root,tmp);
  301. else ll(root,tmp);
  302. }
  303. else{
  304. if(tmp->left==tree) tmp->bf=0;
  305. else if(tree->bf==1) rl(root,tmp);
  306. else rr(root,tmp);
  307. }
  308. }
  309. }
  310. while(root->up) root=root->up;
  311. return root;
  312. }
  313.  
  314. void com(int comm,node *&root){
  315.  
  316. return;
  317. }
  318.  
  319. int *dane(int n){
  320. int index1;
  321. int index2;
  322. int tmp;
  323. int *tab=new int[n];
  324. for(int i=0;i<n;i++) tab[i]=i;
  325. for(int i=0;i<n*10;i++){
  326. index1=rand()%n;
  327. index2=rand()%n;
  328. tmp=tab[index1];
  329. tab[index1]=tab[index2];
  330. tab[index2]=tmp;
  331. }
  332. return tab;
  333. }
  334.  
  335. void dane_delete(int *tab,int n){
  336. delete []tab;
  337. return;
  338. }
  339.  
  340. int main(){
  341. srand(time(NULL));
  342. int cmd;
  343. node *root=NULL;
  344. cout<<"1. dodaj elem (int)\n";
  345. cout<<"2. usun elem (int wartosc)\n";
  346. cout<<"3. znajdz elem (int wartosc)\n";
  347. cout<<"4. dfs preorder, post order\n";
  348. cout<<"5. stworz drzewo losowych (int ilosc)\n";
  349. cout<<"6. usun drzewo\n";
  350. //while(cin>>cmd) com(cmd,root);
  351.  
  352.  
  353. ofstream plik;
  354. plik.open(".\\EEELOOO.txt");
  355. plik.close();
  356. plik.open(".\\EEELOOO.txt",ios::out);
  357. clock_t start;
  358. system("cls");
  359. plik<<"SERIA DANYCH OX\n";
  360. for(int i=500000;i<=5000000;i=i+500000) plik<<i<<" ";
  361. plik<<endl;
  362. int *tab;
  363.  
  364. int a[10];
  365. int b[10];
  366. int c[10];
  367.  
  368. int k=0;
  369.  
  370. for(int i=500000;i<=5000000;i=i+500000){
  371. tab=dane(i);
  372.  
  373. start=clock();
  374. for(int j=0;j<i;j++) root=node_add(root,tab[j]);
  375. a[k]=clock()-start;
  376.  
  377. start=clock();
  378. for(int j=0;j<i/10;j++) node_find_prim(root,j);
  379. b[k]=clock()-start;
  380.  
  381.  
  382. start=clock();
  383. dfs_postorder(root);
  384. c[k]=clock()-start;
  385.  
  386. dane_delete(tab,i);
  387.  
  388. root=NULL;
  389. k++;
  390. }
  391. plik<<"\nDODAWANIE ELEMENTOW DO DRZEWA (N)\n";
  392. for(int i=0;i<10;i++) plik<<a[i]<<" ";
  393. plik<<"\nZNAJDOWANIE ELEMNTU W DRZEWIE (N)\n";
  394. for(int i=0;i<10;i++) plik<<b[i]<<" ";
  395. plik<<"\nUSUWANIE DRZEWA (N)\n";
  396. for(int i=0;i<10;i++) plik<<c[i]<<" ";
  397. plik.close();
  398. return 0;
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement