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