这题.....看个标题和数据基本就能做了
首先要知道堆的性质,大根堆和小跟堆。而且堆构成的树是完全二叉树,所以可以用数组来标记孩子节点
输出路径,深搜下,先遍历右孩子,再遍历左孩子,然后到根节点输出路径即可
判断大根堆和小跟堆我是判断了两次,先判断是否是大根堆,在判断是否是小跟堆,判断方法就是遍历每个点,判断每个点是不是都满足堆得性质
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
typedef struct Tree{
int index;
int num;
int zuo,you;
}tree;
Tree t[2000];
int flag=0;
int path[2000];
int a[1000+10];
void pd(int x,int index){
path[index]=t[x].num;
if(t[x].you==-1&&t[x].zuo==-1){
printf("%d",path[0]);
for(int i=1;i<=index;i++){
printf(" %d",path[i]);
}
printf("\n");
return ;
}
if(x==-1) return ;
pd(t[x].you,index+1);
pd(t[x].zuo,index+1);
}
void pdmax(int x){
if(flag) return ;
if(x==-1) return ;
if(t[x].zuo==-1&&t[x].you==-1) return ;
else if(t[x].zuo==-1&&t[x].you!=-1){
if(a[x]<=a[2*x+1]) flag=1;
}
else if(t[x].zuo!=-1&&t[x].you==-1){
if(a[x]<=a[2*x]) flag=1;
}
else{
if(!(a[x]>a[2*x]&&a[x]>a[2*x+1])) flag=1;
}
pdmax(t[x].zuo);
pdmax(t[x].you);
}
void pdmin(int x){
if(flag) return ;
if(x==-1) return ;
if(t[x].zuo==-1&&t[x].you==-1) return ;
else if(t[x].zuo==-1&&t[x].you!=-1){
if(a[x]>=a[2*x+1]) flag=1;
}
else if(t[x].zuo!=-1&&t[x].you==-1){
if(a[x]>=a[2*x]) flag=1;
}
else{
if(!(a[x]<a[2*x]&&a[x]<a[2*x+1])) flag=1;
}
pdmin(t[x].zuo);
pdmin(t[x].you);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
t[i].num=a[i];
if(2*i>n) t[i].zuo=-1;
else t[i].zuo=2*i;
if(2*i+1>n) t[i].you=-1;
else t[i].you=2*i+1;
}
pd(1,0);
pdmax(1);
if(flag==0){
printf("Max Heap\n");
}
else{
flag=0;
pdmin(1);
if(flag==0){
printf("Min Heap\n");
}
else printf("Not Heap\n");
}
return 0;
}
做完总体感受.....上次因为没参加有点亏,这次题目有点水,可能是因为以后的比赛费用都变成256,所以这次来个简单的
欢迎大家加入 早起学习群,一起学习一起进步!(群号:642179511)