Advertisement
ElooEminem

Untitled

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