
/* 编写算法判断一个序列是否是小根堆 分析: 小根堆的特性就是根节点小于左右孩子结点,对于一个序列我们可以将它看成完全二叉树,依次遍历,对每个节点进行判断 若有一个节点小于它的父亲节点则该序列不是小根堆,注意讨论单分支节点*/#include<stdio.h>bool isMinHeap(int *arr, int len) { if (len % 2 == 0) {//有一个单分支节点 if (arr[len ] < arr[len / 2 ]) { return false; } for (int i = len / 2 -1; i > 0;i--) { if (arr[i] > arr[2 * i] || arr[i] > arr[2 * i + 1])return false; } } else { for (int i = len / 2 ; i > 0; i--) { if (arr[i] > arr[2 * i] || arr[i] > arr[2 * i + 1])return false; } } return true;}int main() { int arr[] = { 0,1,2,3,4,8,6,7}; if (isMinHeap(arr, 7)) { printf("是小根堆"); } else { printf("不是小根堆"); } return 0;}