107.png

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