【PTA数据结构 | C语言版】是不是堆

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

给定一个完全二叉树的层序遍历序列,请判断该二叉树是否是二叉堆。

输入格式:

每组测试第 1 行包含 2 个正整数:m (≤100) 是二叉树的个数;n(1<n≤1000)是每个二叉树中结点的个数。随后 m 行,每行给出 n 个不重复的整数键值(均在 32 位整型 int 范围内),是一个完全二叉树的层序遍历序列。

输出格式:

对每个输入中给定的二叉树,如果其对应了一个最大堆,则在一行中输出 Max Heap;如果对应最小堆,则输出 Min Heap;否则输出 Not Heap。随后在下一行输出这棵树的后序遍历序列。一行中的数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

3 8

98 72 86 60 65 12 23 50

8 38 25 58 52 82 70 60

10 28 15 12 34 9 8 56

输出样例:

Max Heap

50 60 65 72 12 23 86 98

Min Heap

60 58 52 38 82 70 25 8

Not Heap

56 12 34 28 9 8 15 10

代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

#define MAXN 1001

int tree[MAXN];
int n;

// 判断是否为最大堆
int isMaxHeap() {
    for (int i = 1; i <= n/2; i++) {
        int left = 2 * i;
        int right = 2 * i + 1;
        
        if (left <= n && tree[i] < tree[left]) return 0;
        if (right <= n && tree[i] < tree[right]) return 0;
    }
    return 1;
}

// 判断是否为最小堆
int isMinHeap() {
    for (int i = 1; i <= n/2; i++) {
        int left = 2 * i;
        int right = 2 * i + 1;
        
        if (left <= n && tree[i] > tree[left]) return 0;
        if (right <= n && tree[i] > tree[right]) return 0;
    }
    return 1;
}

// 后序遍历二叉树
void postOrder(int root, int *index, int *result) {
    if (root > n) return;
    
    postOrder(2 * root, index, result);       // 遍历左子树
    postOrder(2 * root + 1, index, result);   // 遍历右子树
    result[(*index)++] = tree[root];          // 访问根节点
}

int main() {
    int m;
    scanf("%d %d", &m, &n);
    
    for (int i = 0; i < m; i++) {
        // 读取层序遍历序列
        for (int j = 1; j <= n; j++) {
            scanf("%d", &tree[j]);
        }
        
        // 判断堆的类型
        if (isMaxHeap()) {
            printf("Max Heap\n");
        } else if (isMinHeap()) {
            printf("Min Heap\n");
        } else {
            printf("Not Heap\n");
        }
        
        // 后序遍历
        int result[MAXN];
        int index = 0;
        postOrder(1, &index, result);
        
        // 输出后序遍历结果
        for (int k = 0; k < n; k++) {
            if (k > 0) printf(" ");
            printf("%d", result[k]);
        }
        printf("\n");
    }
    
    return 0;
}    
相关推荐
知彼解己5 分钟前
字符串大数相加:从初稿到优化的思路演进
java·开发语言·算法
haing201934 分钟前
使用deboor法计算三次B样条曲线在参数为u处的位置的方法介绍
算法·b样条曲线·deboor
qq_3521095236 分钟前
旋转数字矩阵 od
算法
大阳12337 分钟前
51单片机4(温度传感器DS18B20)
开发语言·单片机·嵌入式硬件·算法·51单片机
iナナ39 分钟前
Java优选算法——二分查找
数据结构·算法·leetcode
l1t1 小时前
利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
xml·c语言·数据结构·人工智能·算法·解析器
宇钶宇夕2 小时前
西门子 S7-200 SMART PLC 编程:转换 / 定时器 / 计数器指令详解 + 实战案例(指令讲解篇)
运维·算法·自动化
我叫汪枫2 小时前
Spring Boot图片验证码功能实现详解 - 从零开始到完美运行
java·前端·javascript·css·算法·html
l1t2 小时前
how to build tbox xml into the demo
xml·linux·c语言·parser·tbox
lifallen2 小时前
揭秘KafkaStreams 线程缓存:NamedCache深度解析
数据结构·算法·缓存·kafka·apache