Odense

Task 4

Jan 30th, 2021 (edited)
415
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. typedef struct __BTNode BTNode;
  6. typedef struct __BSTree BSTree;
  7.  
  8. int count = 0;
  9.  
  10. //имплементация сущности нашего узла (значение, ссылки на левый и правый дочерние узлы)
  11. struct __BTNode
  12. {
  13.     int value;
  14.     BTNode *left;
  15.     BTNode *right;
  16. };
  17.  
  18. //конструктор, создающий сущность узла (выделяет под него память), ссылки на левый и правый дочерние узлы и заполняющий узел его
  19. //значением
  20. BTNode *BTree_new(int value)
  21. {
  22.     BTNode *self = malloc(sizeof(BTNode));
  23.     if (self == NULL)
  24.     {
  25.         abort();
  26.     }
  27.     self->value = value;
  28.     self->left = NULL;
  29.     self->right = NULL;
  30.    
  31.     return self;
  32. }
  33.  
  34. //вспомогательная сущность
  35. struct __BSTree
  36. {
  37.     BTNode *root;
  38. };
  39.  
  40. //конструктор дерева (выделяет под него память)
  41. BSTree *BSTree_new(void)
  42. {
  43.     BSTree *self = malloc(sizeof(BSTree));
  44.     if(self == NULL)
  45.     {
  46.         fprintf(stderr, "Out of Memory!\n");
  47.         abort();
  48.     }
  49.     self->root = NULL;
  50.     return self;
  51. }
  52.  
  53. //вставка в дерево происходит рекурсивно (функция будет вызывать сама себя до тех пор,
  54. //пока не найдёт место, куда можно вставить новый узел с его значением)
  55. //принцип - если значение дочернего узла больше, чем в родительском, то такой узел присоединяется справа от родительского узла
  56. //если меньше - слева
  57. //визулальное представление дерева из задания -- по ссылке https://ibb.co/4JMP315
  58. static void insert(BTNode *node, int key)
  59. {
  60.     if (key < node->value)
  61.     {
  62.         if (node->left == NULL)
  63.         {
  64.             node->left = BTree_new(key);
  65.         }
  66.         else
  67.         {
  68.             insert(node->left, key);
  69.         }
  70.     }
  71.     else if (key > node->value)
  72.     {
  73.         if (node->right == NULL)
  74.         {
  75.             node->right = BTree_new(key);
  76.         }
  77.         else
  78.         {
  79.             insert(node->right, key);
  80.         }
  81.     }
  82.     else
  83.     {
  84.         fprintf(stderr, "Not unique!\n");
  85.         abort();
  86.     }
  87. }
  88.  
  89. //вспомогательная функция (обёртка) для вставки
  90. void BSTree_insert(BSTree *self, int key)
  91. {
  92.     if (self->root == NULL)
  93.     {
  94.         self->root = BTree_new(key);
  95.     }
  96.     else
  97.     {
  98.         insert(self->root, key);
  99.     }
  100. }
  101.  
  102. //рекурсивный обход узлов по уровням (начинается с 0), проверка значений на некратность трём
  103. static void print_level(BTNode *node, int level)
  104. {
  105.     for (int i = 0; i < level; i++)
  106.     {
  107.         putchar('.');
  108.     }
  109.     if (node == NULL)
  110.     {
  111.         printf("(null)\n");
  112.     }
  113.     else
  114.     {
  115.         printf("%i\n", node->value);
  116.         //проверка выполенения условия задания для инкрементация счётчика
  117.         if (level % 2 == 0 && node->value % 3 != 0)
  118.             count++;
  119.         //если на текущем уровне не осталось неохваченных узлов - переход на следующий уровень, функция снова вызывает сама себя
  120.         if (node->left || node->right)
  121.         {
  122.             level++;
  123.             print_level(node->left, level);
  124.             print_level(node->right, level);
  125.         }
  126.     }
  127. }
  128.  
  129. //вспомогательная функция для печати
  130. void BSTree_printFormat(BSTree * self)
  131. {
  132.     print_level(self->root, 0);
  133. }
  134.  
  135. int main()
  136. {
  137.     BSTree *tree = BSTree_new();
  138.     BSTree_insert(tree, 560);
  139.     BSTree_insert(tree, 952);
  140.     BSTree_insert(tree, 875);
  141.     BSTree_insert(tree, 360);
  142.     BSTree_insert(tree, 86);
  143.     BSTree_insert(tree, 850);
  144.     BSTree_insert(tree, 522);
  145.     BSTree_insert(tree, 733);
  146.     BSTree_insert(tree, 455);
  147.     BSTree_insert(tree, 257);
  148.     BSTree_insert(tree, 468);
  149.     BSTree_insert(tree, 97);
  150.     BSTree_insert(tree, 775);
  151.     BSTree_insert(tree, 141);
  152.     BSTree_insert(tree, 940);
  153.     BSTree_insert(tree, 177);
  154.     BSTree_insert(tree, 743);
  155.     BSTree_insert(tree, 281);
  156.     BSTree_insert(tree, 616);
  157.     BSTree_insert(tree, 122);
  158.    
  159.     BSTree_printFormat(tree);
  160.    
  161.     printf("\nAmount of nodes on odd levels with keys, which are not a multiple on three: %d", count);
  162.  
  163.     return 0;
  164. }
Add Comment
Please, Sign In to add comment