Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.24 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <assert.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <stdio.h>
  6.  
  7. struct treeNode
  8. {
  9. int data;
  10. struct treeNode* left;
  11. struct treeNode* right;
  12. };
  13.  
  14. typedef struct treeNode* BSTree;
  15.  
  16.  
  17. static struct treeNode* createNode(int data)
  18. {
  19. struct treeNode *temp;
  20. temp = (struct treeNode*)calloc(1, sizeof(struct treeNode));
  21. assert(temp != NULL);
  22. temp->left = NULL;
  23. temp->right = NULL;
  24. temp->data = data;
  25.  
  26. return temp;
  27. }
  28.  
  29. void recursiveToArray(const BSTree tree, int arr[], int *temp)
  30. {
  31. if (tree == NULL)
  32. {
  33. return;
  34. }
  35.  
  36. else
  37. {
  38.  
  39. recursiveToArray(tree->left, arr, temp);
  40. arr[*temp] = tree->data;
  41. temp++;
  42. recursiveToArray(tree->right, arr, temp);
  43. }
  44.  
  45. }
  46.  
  47. static int* writeSortedToArray(const BSTree tree)
  48. {
  49. int size = countingNodes(&(*tree));
  50. int *arr;
  51. arr = (int*)calloc(size, sizeof(int));
  52. assert(arr != NULL);
  53. int *temp=arr;
  54.  
  55. recursiveToArray(tree, arr, temp);
  56. for (int i = 0; i < 8; i++)
  57. {
  58. printf("%d\n", *(arr+i));
  59. }
  60.  
  61.  
  62. return arr;
  63. }
  64.  
  65. void buildTree(BSTree* tree, int *arr, int start, int slut)
  66. {
  67.  
  68.  
  69. if (start>slut)
  70. {
  71. return;
  72. }
  73.  
  74.  
  75. int mitten = ((start + slut) / 2);
  76.  
  77. *tree = createNode(*(arr + mitten));
  78.  
  79.  
  80. buildTree(&(*tree)->right, arr, mitten+1, slut);
  81. buildTree(&(*tree)->left, arr, start, mitten-1);
  82.  
  83.  
  84. }
  85.  
  86. /* Bygger upp ett sorterat, balanserat trad fran en sorterad array */
  87. static void buildTreeSortedFromArray(BSTree* tree, const int arr[], int size)
  88. {
  89.  
  90. int start = 0, slut = size-1;
  91.  
  92.  
  93.  
  94. /**tree = createNode(arr[mitten]);
  95.  
  96. buildTreeSortedFromArray(&(*tree)->left, arr, mitten);
  97. buildTreeSortedFromArray(&(*tree)->right, arr, slut);*/
  98. buildTree(&(*tree), arr, start, slut);
  99.  
  100.  
  101. }
  102.  
  103.  
  104.  
  105. {
  106. return NULL;
  107. }
  108.  
  109. {
  110. if (tree == NULL)
  111. return 1;
  112. else
  113. return 0;
  114. }
  115.  
  116.  
  117.  
  118. {
  119. if (*tree == NULL)
  120. {
  121. *tree=createNode(data);
  122. }
  123. else if((*tree)->data==data)
  124. {
  125. printf("Element already in tree.");
  126. return;
  127. }
  128. else if ((*tree)->data > data)
  129. {
  130. insertSorted(&(*tree)->left, data);
  131. }
  132. else if ((*tree)->data < data)
  133. {
  134. insertSorted(&(*tree)->right, data);
  135. }
  136.  
  137.  
  138. assert(find(*tree, data)==1);
  139.  
  140. }
  141.  
  142. int countingNodes(const BSTree tree)
  143. {
  144. if (tree == NULL)
  145. {
  146. return 0;
  147. }
  148. if (tree->left == NULL && tree->right==NULL)
  149. {
  150. return 1;
  151. }
  152. else
  153. {
  154. int count = (countingNodes(tree->left) + countingNodes(tree->right)) + 1;
  155. return count;
  156. }
  157. }
  158.  
  159.  
  160. void printPreorder(const BSTree tree, FILE *textfile)
  161. {
  162.  
  163. if (tree == NULL)
  164. {
  165. return;
  166. }
  167. fprintf(textfile, "%d\t", tree->data);
  168. printPreorder(tree->left, textfile);
  169. printPreorder(tree->right, textfile);
  170. }
  171.  
  172. void printInorder(const BSTree tree, FILE *textfile)
  173. {
  174.  
  175. if (tree == NULL)
  176. {
  177. return;
  178. }
  179. printInorder(tree->left, textfile);
  180. fprintf(textfile, "%d\t", tree->data);
  181. printInorder(tree->right, textfile);
  182. }
  183.  
  184. void printPostorder(const BSTree tree, FILE *textfile)
  185. {
  186. if (tree == NULL)
  187. {
  188. return;
  189. }
  190.  
  191. printPostorder(tree->left, textfile);
  192. printPostorder(tree->right, textfile);
  193. fprintf(textfile, "%d\t", tree->data);
  194. }
  195.  
  196.  
  197. int find(const BSTree tree, int data)
  198. {
  199. if (tree == NULL)
  200. {
  201. return 0;
  202. }
  203. else
  204. {
  205. if (tree->data == data)
  206. {
  207. return 1;
  208. }
  209. else if (tree->data > data)
  210. {
  211. return find(tree->left, data);
  212. }
  213. else
  214. {
  215. return find(tree->right, data);
  216. }
  217. }
  218.  
  219. }
  220.  
  221.  
  222. void removeElement(BSTree* tree, int data)
  223. {
  224.  
  225. if (*tree == NULL)
  226. {
  227. printf("Tree is empty.\n");
  228. return;
  229. }
  230. if ((*tree)->data > data)
  231. {
  232. removeElement(&(*tree)->left, data);
  233. }
  234. else if ((*tree)->data < data)
  235. {
  236. removeElement(&(*tree)->right, data);
  237. }
  238. else
  239. {
  240. BSTree remove;
  241. if ((*tree)->left == NULL && (*tree)->right==NULL)
  242. {
  243. free(*tree);
  244. *tree = NULL;
  245. }
  246. else if ((*tree)->left != NULL && (*tree)->right == NULL)
  247. {
  248. remove = *tree;
  249. *tree = (*tree)->left;
  250. free(remove);
  251. remove = NULL;
  252. }
  253. else if ((*tree)->left == NULL && (*tree)->right != NULL)
  254. {
  255. remove = *tree;
  256. *tree = (*tree)->right;
  257. free(remove);
  258. remove = NULL;
  259. }
  260. else
  261. {
  262. BSTree minRight = (*tree)->right;
  263. while (minRight->left != NULL)
  264. {
  265. minRight = minRight->left;
  266. }
  267. (*tree)->data = minRight->data;
  268. removeElement(&(*tree)->right, minRight->data);
  269. }
  270. }
  271.  
  272. }
  273.  
  274.  
  275. int numberOfNodes(const BSTree tree)
  276. {
  277. int i = countingNodes(&(*tree));
  278. return i; //Ersatt med korrekt returvarde
  279. }
  280.  
  281.  
  282. int depth(const BSTree tree)
  283. {
  284.  
  285. if (tree == NULL)
  286. {
  287. return 0;
  288. }
  289. int vänsterDjup = depth(tree->left),
  290. högerDjup = depth(tree->right);
  291. if (vänsterDjup > högerDjup)
  292. {
  293. return(vänsterDjup + 1);
  294. }
  295. else
  296. return(högerDjup + 1);
  297.  
  298. }
  299.  
  300.  
  301. int minDepth(const BSTree tree)
  302. {
  303. float antal = countingNodes(&(*tree));
  304. double logRäkning = log2(antal + 1);
  305. logRäkning = ceil(logRäkning);
  306. return (int)logRäkning;
  307.  
  308. }
  309.  
  310. void balanceTree(BSTree* tree)
  311. {
  312. int size = numberOfNodes(*tree);
  313. if (*tree == NULL)
  314. {
  315. return;
  316. }
  317. int arr;
  318. arr=writeSortedToArray(*tree);
  319. freeTree(&(*tree));
  320. buildTreeSortedFromArray(&(*tree), arr, size);
  321.  
  322. }
  323.  
  324.  
  325. {
  326. if (*tree == NULL)
  327. {
  328. return;
  329. }
  330. else
  331. {
  332. freeTree(&(*tree)->left);
  333. freeTree(&(*tree)->right);
  334. free(*tree);
  335. *tree = NULL;
  336. }
  337.  
  338. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement