Guest User

Untitled

a guest
Aug 31st, 2025
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. /* to help you solve the kata, a queue implementation has been
  5. preloaded for you */
  6.  
  7. typedef struct Queue Queue;
  8.  
  9. // the queue elements are pointers
  10.  
  11. // creates a new queue
  12. extern Queue *new_queue (void);
  13. // returns the number of elements in the queue
  14. extern size_t queue_size (const Queue *queue);
  15. // adds an element at the back of the queue and returns the queue
  16. extern Queue *queue_enqueue (Queue *queue, const void *data);
  17. // removes the element at the front of the queue and returns it
  18. extern void *queue_dequeue (Queue *queue);
  19. // frees the queue, do not forget to call it !
  20. extern void free_queue (Queue *queue);
  21. /* ==================================================== */
  22.  
  23. typedef struct Tree {
  24. struct Tree *left, *right;
  25. int value;
  26. } Tree;
  27.  
  28. Queue* q;
  29.  
  30. int task;
  31.  
  32. void proceed_childs(const Tree *ptr, int depth, char c) {
  33.  
  34. if(depth>3) return;
  35. char tab[depth+1];
  36. for(int i=0;i<depth;i++) {
  37. tab[i] = '\t';
  38. }
  39. tab[depth] = '\0';
  40.  
  41.  
  42. printf("\n%s#%d %c (node %p)\n", tab, depth, c, ptr);
  43.  
  44. if(ptr->left != NULL) {
  45. queue_enqueue(q, ptr->left);
  46. /*if(depth<2) {
  47. queue_enqueue(q, &ptr->left->value);
  48. printf("%sLeft [%d]\n",tab,ptr->left->value);
  49. } else {
  50. queue_enqueue(q, &ptr->left->value);
  51. printf("%s!!! Left [%d] %p\n",tab,ptr->left->value, &ptr->left);
  52. } */
  53. }
  54. if(ptr->right != NULL) {
  55. queue_enqueue(q, ptr->right);
  56. /*if(depth<2) {
  57. queue_enqueue(q, &ptr->right->value);
  58. printf("%sRight [%d]\n",tab,ptr->right->value);
  59. } else {
  60. printf("%s!!! Right [%d] %p\n",tab,ptr->right->value, &ptr->right);
  61. }*/
  62. }
  63.  
  64. ++depth;
  65. printf("\n%s>>Next depth %d\n", tab, depth);
  66.  
  67.  
  68. if(ptr->left != NULL) {
  69. //printf("%sCall left %p from %p (new depth %d):\n", tab,ptr->left, ptr, depth);
  70. proceed_childs(ptr->left, depth, 'l');
  71. }
  72.  
  73. if(ptr->right!=NULL) {
  74. //printf("%sCall right %p from %p (new depth %d):\n", tab, ptr->right, ptr, depth);
  75. proceed_childs(ptr->right, depth, 'r');
  76. }
  77. }
  78.  
  79. int *tree_by_levels (const Tree *tree, size_t *tree_size)
  80. {
  81. task++;
  82. if(task>1) return NULL;
  83. printf("\nTask #%d\n", task);
  84. q = new_queue();
  85. queue_enqueue(q, tree);
  86. proceed_childs(tree, 0, '-');
  87. *tree_size = queue_size(q);
  88. printf("\nTotal: %zu\n",*tree_size);
  89.  
  90. int* result = malloc(sizeof(int)*(*tree_size));
  91.  
  92. for(size_t i=0; i<*tree_size; i++) {
  93. result[i] = -1;
  94. if(queue_size(q)==0) continue;
  95. void* e = queue_dequeue(q);
  96. if(e==NULL) {
  97. printf("Error");
  98. } else {
  99.  
  100. Tree* node = (Tree*)e;
  101. int value = node->value;
  102. printf("%d %p %p %d\n", i, e, node, node->value);
  103. result[i] = value;
  104. }
  105. }
  106.  
  107. printf("\n\n");
  108. free_queue(q);
  109.  
  110. for(int i=0;i<*tree_size;i++) {
  111. printf("%d=%d\n", i, result[i]);
  112. }
  113.  
  114. return result; // return a heap-allocated array, it will be freed
  115. }
  116.  
  117.  
  118.  
Advertisement
Add Comment
Please, Sign In to add comment