Update a4/program.c
This commit is contained in:
parent
3ee61b073b
commit
a72734817f
53
a4/program.c
53
a4/program.c
@ -0,0 +1,53 @@
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user