PAT (Advanced Level) Practice - 1147 Heaps(30 分)

简介: PAT (Advanced Level) Practice - 1147 Heaps(30 分)

题目链接:点击打开链接

题目大意:给一个树的层序遍历,判断它是不是堆,是大顶堆还是小顶堆。输出这个树的后序遍历。

解题思路:

  1. 借用序列已经输入好的数组,正好是完全二叉树层序遍历的下标的优势来操作比较。
  2. 首先根据 a[0] 和 a[1] 的大小比较判断可能是大顶还是小顶,分别赋值 f 为 1 和 -1,先根据层序遍历,从0~(n-1)/2【所有有孩子的结点】判断他们的孩子是不是满足 f 的要求,如果有一个结点不满足,那就将 f==0 表示这不是一个堆。根据 f 输出是否是堆,大顶堆还是小顶堆,然后后序遍历,根据 id 分别遍历 id*2+1 和 id*2+2,即他们的左右孩子,遍历完左右子树后输出根结点,即完成了后序遍历。

AC 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
int n;
int a[1009];
void postT(int id) // 层序遍历 -> 后序遍历
{
    if(id>=n) return;
    postT(id*2+1);
    postT(id*2+2);
    printf("%d%c",a[id],id==0?'\n':' '); // Ps: 这里不是 id==n-1 噢
}
int main()
{
    int k,l,r,f;
    scanf("%d%d",&k,&n);
    while(k--)
    {
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        f=a[0]>a[1]?1:-1;
        for(int i=0;i<=(n-1)/2;i++)
        {
            l=i*2+1, r=i*2+2;
            if(f==1 && (a[i]<a[l] || (r<n && a[i]<a[r]))){f=0; break;}
            else if(f==-1 && (a[i]>a[l] || (r<n && a[i]>a[r]))){f=0; break;}
        }
        if(!f) puts("Not Heap");
        else printf("%s Heap\n",f==1?"Max":"Min");
        postT(0);
    }
    return 0;
}
目录
相关文章
|
JavaScript 前端开发 开发者
|
Java 数据库连接 数据库
Spring Boot 集成 MyBatis-Plus 总结
Spring Boot 集成 MyBatis-Plus 总结
1177 3
|
存储 Java 测试技术
Spring 拾枝杂谈—Spring原生容器结构剖析(通俗易懂)
Spring 第一节 拾枝杂谈 分析Spring底层容器。
217 0
|
Web App开发 XML iOS开发
HTTP 请求包(浏览器信息)
HTTP 请求包(浏览器信息)
204 0
|
程序员 C++
开源项目推荐:OpenGL之Qt专辑;重点是ccViewer和libQGLViewer
开源项目推荐:OpenGL之Qt专辑;重点是ccViewer和libQGLViewer
1555 0
开源项目推荐:OpenGL之Qt专辑;重点是ccViewer和libQGLViewer
|
负载均衡 算法 前端开发
Nginx + Tomcat 实现负载均衡,动静分离集群部署
1、Nginx实现负载均衡原理 2、Nginx配置反向代理主要参数 3、实验
Nginx + Tomcat 实现负载均衡,动静分离集群部署
|
算法 网络安全 数据安全/隐私保护
【计算机网络】网络安全 : 公钥密码体质 ( 公钥 - 加密密钥 | 私钥 - 解密密钥 | 与对称密钥体质对比 | 特点 | 数字签名引入 )
【计算机网络】网络安全 : 公钥密码体质 ( 公钥 - 加密密钥 | 私钥 - 解密密钥 | 与对称密钥体质对比 | 特点 | 数字签名引入 )
388 0
|
人工智能 大数据
5月14日云栖精选夜读丨阿里巴巴在十年前的那个晚上
工号在16000以前的阿里员工,都不会忘记10年前一起度过的那个下午和晚上,历史的偶然混着性格基因里的必然,开启了一扇“窗户”。2008年5月12日下午,地震的余波比地震的消息来得更快。
3339 0
|
3天前
|
人工智能 运维 安全