fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // Структура узла дерева
  5. typedef struct Tree {
  6. int num;
  7. struct Tree *left, *right;
  8. } Tree;
  9.  
  10. // Функции прототипы
  11. void AddNode(int x, Tree **MyTree);
  12. void ShowTree(Tree *MyTree, int level);
  13. int CountNodesAtLevel(Tree *MyTree, int level);
  14. void DeleteTree(Tree **MyTree);
  15.  
  16. int main() {
  17. Tree *root = NULL;
  18. int n; // уровень для подсчёта
  19. int count; // количество элементов в последовательности
  20.  
  21. // Ввод количества элементов
  22. printf("Введите количество элементов: ");
  23. scanf("%d", &count);
  24.  
  25. printf("Введите элементы последовательности:\n");
  26. for (int i = 0; i < count; i++) {
  27. int val;
  28. scanf("%d", &val);
  29. AddNode(val, &root);
  30. }
  31.  
  32. printf("\nДерево:\n");
  33. ShowTree(root, 0);
  34.  
  35. printf("\nВведите уровень для подсчёта узлов: ");
  36. scanf("%d", &n);
  37.  
  38. int result = CountNodesAtLevel(root, n);
  39. printf("Число узлов на уровне %d: %d\n", n, result);
  40.  
  41. // Освобождение памяти
  42. DeleteTree(&root);
  43.  
  44. return 0;
  45. }
  46.  
  47. // Добавление узла в дерево
  48. void AddNode(int x, Tree **MyTree) {
  49. if (*MyTree == NULL) {
  50. *MyTree = (Tree*) malloc(sizeof(Tree));
  51. (*MyTree)->num = x;
  52. (*MyTree)->left = NULL;
  53. (*MyTree)->right = NULL;
  54. } else {
  55. if (x < (*MyTree)->num) {
  56. AddNode(x, &(*MyTree)->left);
  57. } else if (x > (*MyTree)->num) {
  58. AddNode(x, &(*MyTree)->right);
  59. }
  60. // Если x равно текущему значению — ничего не делаем
  61. }
  62. }
  63.  
  64. // Вывод дерева с отступами по уровням
  65. void ShowTree(Tree *MyTree, int level) {
  66. if (MyTree != NULL) {
  67. ShowTree(MyTree->left, level + 1);
  68. for (int i = 0; i < level; i++)
  69. printf(" "); // отступы для визуализации уровня
  70. printf("%d\n", MyTree->num);
  71. ShowTree(MyTree->right, level + 1);
  72. }
  73. }
  74.  
  75. // Подсчет количества узлов на заданном уровне
  76. int CountNodesAtLevel(Tree *MyTree, int level) {
  77. if (MyTree == NULL)
  78. return 0;
  79. if (level == 0)
  80. return 1;
  81. return CountNodesAtLevel(MyTree->left, level - 1) + CountNodesAtLevel(MyTree->right, level - 1);
  82. }
  83.  
  84. // Освобождение памяти дерева
  85. void DeleteTree(Tree **MyTree) {
  86. if (*MyTree != NULL) {
  87. DeleteTree(&(*MyTree)->left);
  88. DeleteTree(&(*MyTree)->right);
  89. free(*MyTree);
  90. *MyTree = NULL;
  91. }
  92. }
Success #stdin #stdout 0s 5288KB
stdin
Standard input is empty
stdout
Введите количество элементов: Введите элементы последовательности:

Дерево:

Введите уровень для подсчёта узлов: Число узлов на уровне 22077: 0