Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Profiler.h"
  4. Profiler profiler("DynamicOrderStatistics");
  5. #define max_size 10000
  6.  
  7. int op_select = 0;
  8. int op_delete = 0;
  9. int op_build = 0;
  10.  
  11. typedef struct NodeT
  12. {
  13. int data;
  14. int size;
  15. struct NodeT *left, *right, *parent;
  16. } NodeT;
  17.  
  18. NodeT* initialize_node(int data)
  19. {
  20. NodeT* new_node = (NodeT*)malloc(sizeof(NodeT));
  21. op_build++;
  22. new_node->data = data;
  23. op_build++;
  24. new_node->size = 1;
  25. new_node->left = new_node->right = NULL;
  26. new_node->parent = NULL;
  27. return new_node;
  28. }
  29. NodeT* buildPBT(int a[], int first, int last) //build a PBT from an ordered array
  30. {
  31. NodeT* root = (NodeT*)malloc(sizeof(NodeT));
  32. op_build++;
  33. if (first <= last)
  34. {
  35. int mid = (first + last + 1) / 2;
  36. root = initialize_node(a[mid]);
  37. op_build = op_build + 2;
  38. root->left = buildPBT(a, first, mid - 1);
  39. root->right = buildPBT(a, mid + 1, last);
  40.  
  41. op_build++;
  42. if (root->left != NULL)
  43. {
  44. op_build++;
  45. root->size = root->size + root->left->size;
  46. }
  47. op_build++;
  48. if (root->right != NULL)
  49. {
  50. op_build++;
  51. root->size = root->size + root->right->size;
  52. }
  53.  
  54. op_build++;
  55. if (root->left != NULL)
  56. {
  57. op_build++;
  58. root->left->parent = root;
  59. }
  60. op_build++;
  61. if (root->right != NULL)
  62. {
  63. op_build++;
  64. root->right->parent = root;
  65. }
  66. return root;
  67. }
  68. else
  69. return NULL;
  70. }
  71.  
  72. void show_tree(NodeT* p, int level)
  73. {
  74. if (p != NULL)
  75. {
  76. show_tree(p->right, level + 1);
  77. for (int i = 0; i <= level; i++)
  78. printf(" ");
  79. if(p->parent == NULL)
  80. printf("%d,%d - NULL\n\n", p->data, p->size);
  81. else
  82. printf("%d,%d - %d\n\n", p->data, p->size, p->parent->data);
  83. show_tree(p->left, level + 1);
  84. }
  85. }
  86.  
  87. NodeT* OS_Select(NodeT* root, int i)
  88. {
  89. int r;
  90. op_select++;
  91. if (root != NULL)
  92. {
  93. op_select++;
  94. if (root->left != NULL)
  95. r = root->left->size + 1;
  96. else
  97. r = 1;
  98. if (i == r)
  99. return root;
  100. else
  101. {
  102. if (i < r)
  103. return OS_Select(root->left, i);
  104. else
  105. return OS_Select(root->right, i - r);
  106. }
  107. }
  108. else
  109. return NULL;
  110. }
  111.  
  112. NodeT* findMin(NodeT* pNode)
  113. {
  114. op_delete++;
  115. if (pNode == NULL)
  116. return NULL;
  117. op_delete++;
  118. if (pNode->left != NULL)
  119. return findMin(pNode->left);
  120. else
  121. return pNode;
  122.  
  123. }
  124.  
  125. void transplant(NodeT* root, NodeT* u, NodeT* v)
  126. {
  127. op_delete++;
  128. if (u->parent == NULL)
  129. {
  130. root = v;
  131. op_delete++;
  132. }
  133. else
  134. {
  135. op_delete++;
  136. if (u == u->parent->left)
  137. {
  138. u->parent->left = v;
  139. op_delete++;
  140. }
  141. else
  142. {
  143. op_delete++;
  144. u->parent->right = v;
  145. }
  146. if (v != NULL)
  147. {
  148. v->parent = u->parent;
  149. op_delete++;
  150. }
  151. }
  152. }
  153. void delete_node(NodeT* root, NodeT* z)
  154. {
  155. op_delete++;
  156. if (z->left == NULL)
  157. {
  158. // op_delete++;
  159. NodeT* aux = z;
  160. op_delete++;
  161. while (aux->parent != NULL)
  162. {
  163. op_delete++;
  164. aux->parent->size--;
  165. op_delete++;
  166. aux = aux->parent;
  167. op_delete++;
  168. }
  169. op_delete++;
  170. transplant(root, z, z->right);
  171. }
  172. else
  173. {
  174. NodeT* aux = z;
  175. op_delete++;
  176. while (aux->parent != NULL)
  177. {
  178. op_delete++;
  179. aux->parent->size--;
  180. op_delete++;
  181. aux = aux->parent;
  182. op_delete++;
  183. }
  184. op_delete++;
  185. op_delete++;
  186. if (z->right == NULL)
  187. {
  188. NodeT* aux = z;
  189. op_delete++;
  190. while (aux->parent != NULL)
  191. {
  192. op_delete++;
  193. aux->parent->size--;
  194. op_delete++;
  195. aux = aux->parent;
  196. op_delete++;
  197. }
  198. op_delete++;
  199. transplant(root, z, z->left);
  200. }
  201. else
  202. {
  203. op_delete++;
  204. NodeT* y = findMin(z->right);
  205. op_delete++;
  206. NodeT* aux = y;
  207. while (aux->parent != NULL)
  208. {
  209. op_delete++;
  210. aux->parent->size--;
  211. op_delete++;
  212. aux = aux->parent;
  213. op_delete++;
  214. }
  215. op_delete++;
  216. op_delete++;
  217. if (y->parent != z)
  218. {
  219. transplant(root, y, y->right);
  220. op_delete++;
  221. y->right = z->right;
  222. op_delete++;
  223. y->right->parent = y;
  224. }
  225. transplant(root, z, y);
  226. op_delete++;
  227. y->left = z->left;
  228. op_delete++;
  229. y->left->parent = y;
  230. op_delete++;
  231. y->size = z->size;
  232. }
  233. }
  234.  
  235. }
  236. int main()
  237. {
  238. ///////demo
  239. NodeT* root = (NodeT*)malloc(sizeof(NodeT));
  240. int n = 11;
  241. int a[] = { 5, 10, 20, 27, 30, 31, 32, 35, 40, 45, 70 };
  242. int i;
  243. NodeT* y;
  244. //int a[] = { 1, 2, 3, 4};
  245. //int n = 4;
  246. root = NULL;
  247. root = buildPBT(a, 0, n - 1);
  248. show_tree(root, 0);
  249.  
  250. i = 6;//two children 31, root
  251. y = OS_Select(root, i);
  252. if (y != NULL)
  253. printf("I found the element %d of rank %d\n", y->data, i);
  254. else
  255. printf("We don't have rank %d in this tree.", i);
  256. delete_node(root, y);
  257. show_tree(root, 0);
  258.  
  259.  
  260. return 0;
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement