usaa24/a4/program.c

54 lines
2.0 KiB
C
Raw Normal View History

2024-11-19 15:55:45 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // Додаємо цю бібліотеку для strtok
#include <stdbool.h>
bool is_min_heap(int *arr, int n) {
// Перевіряємо мінімальну коповість
for (int i = 0; i < n; i++) {
int l = 2 * i + 1; // Лівий син
int r = 2 * i + 2; // Правий син
if (l < n && arr[i] > arr[l]) return false; // Перевірка лівого сина
if (r < n && arr[i] > arr[r]) return false; // Перевірка правого сина
}
return true;
}
void print_preorder(int *arr, int n, int i, int level) {
// Якщо вузол виходить за межі масиву, повертаємося
if (i >= n) return;
// Вивід вузла з відступами залежно від рівня
for (int j = 0; j < level; j++) printf(" ");
printf("%d\n", arr[i]);
// Рекурсивно обходимо лівого і правого синів
print_preorder(arr, n, 2 * i + 1, level + 1); // Лівий син
print_preorder(arr, n, 2 * i + 2, level + 1); // Правий син
}
int main() {
// Зчитування чисел із вводу
printf("Введіть числа, розділені пробілами (закінчіть Enter): ");
char input[1024];
fgets(input, sizeof(input), stdin);
// Перетворення рядка на масив чисел
int arr[100], n = 0;
char *token = strtok(input, " ");
while (token != NULL) {
arr[n++] = atoi(token); // Конвертуємо в ціле число і додаємо до масиву
token = strtok(NULL, " ");
}
// Перевірка, чи є масив мінімальною купою
if (is_min_heap(arr, n)) {
printf("Є така купа:\n");
print_preorder(arr, n, 0, 0); // Вивід дерева у форматі preorder
} else {
printf("Не є копою.\n");
}
return 0;
}