usaa24/a4/program.c
2024-11-24 17:53:39 +00:00

78 lines
2.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
// Funkcia na overenie, či pole spĺňa podmienku binárnej minimálnej kopovitosti
bool is_min_heap(int arr[], int n) {
for (int i = 0; i < n; i++) {
int left = i * 2 + 1;
int right = i * 2 + 2;
// Kontrola ľavého syna
if (left < n && arr[left] < arr[i]) {
return false;
}
// Kontrola pravého syna
if (right < n && arr[right] < arr[i]) {
return false;
}
}
return true;
}
// Rekurzívna funkcia na výpis binárneho stromu v "preorder" poradí
void print_preorder(int arr[], int n, int index, int level) {
if (index >= n) return;
// Výpis aktuálneho uzla s medzerami podľa úrovne
for (int i = 0; i < level; i++) {
printf(" ");
}
printf("%d\n", arr[index]);
// Rekurzívne volania pre ľavého a pravého syna
print_preorder(arr, n, index * 2 + 1, level + 1); // Ľavý syn
print_preorder(arr, n, index * 2 + 2, level + 1); // Pravý syn
}
int main() {
char input[256];
int arr[100];
int n = 0;
// Načítanie vstupu
// printf("Zadajte čísla oddelené medzerou: ");
if (fgets(input, sizeof(input), stdin) == NULL) {
printf("Chyba pri načítaní vstupu.\n");
return 1;
}
// Odstránenie znaku nového riadku, ak existuje
input[strcspn(input, "\n")] = '\0';
// Parsovanie vstupu
char *ptr = strtok(input, " ");
while (ptr != NULL) {
arr[n++] = atoi(ptr);
ptr = strtok(NULL, " ");
}
// Ak je na vstupe len jedno číslo
if (n == 1) {
printf("Je to taka kopa:\n");
printf("%d\n", arr[0]);
return 0;
}
// Overenie, či je to binárna kopa
if (is_min_heap(arr, n)) {
printf("Je to taka kopa:\n");
print_preorder(arr, n, 0, 0); // Výpis v "preorder" poradí
} else {
printf("Nie je kopa.\n");
}
return 0;
}