54 lines
2.0 KiB
C
54 lines
2.0 KiB
C
#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;
|
||
}
|