用c语言判断数组是否为堆,输出代码
时间: 2024-09-28 07:16:48 浏览: 33
在 C 语言中,判断一个数组是否为堆(也称为大顶堆或最小堆),通常需要检查每个元素都满足堆的性质:即任意节点的值都大于其直接子节点的值(对于最小堆)。这里是一个简单的递归函数示例,用于判断给定的数组是否形成最小堆:
```c
#include <stdio.h>
// 定义比较函数,用于判断父节点是否小于等于子节点
int compare(const void *a, const void *b) {
int nodeA = *(int*)a;
int nodeB = *(int*)b;
return (nodeA <= nodeB);
}
// 判断数组是否为堆
int isMaxHeap(int arr[], int n) {
if (n == 0 || n == 1) { // 基本情况:空堆或只有一个元素的堆都是堆
return 1;
}
// 检查根节点是否满足堆条件
if (!compare(arr, arr + n / 2)) {
return 0; // 根节点违反了堆条件,不是堆
}
// 对除了最后一个元素之外的所有其他非叶子节点递归检查
int i = n / 2 - 1;
while (i >= 0) {
if (!isMaxHeap(arr, i)) { // 如果当前子树不满足堆条件,则返回false
return 0;
}
i--;
}
return 1;
}
int main() {
int arr[] = {50, 40, 90, 80, 70}; // 示例数组
int size = sizeof(arr) / sizeof(arr[0]);
if (isMaxHeap(arr, size)) {
printf("给定数组是最大堆。\n");
} else {
printf("给定数组不是最大堆。\n");
}
return 0;
}
```
阅读全文