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;
|
|
|
|
|
}
|