PAT 1155 Heap Paths (30 分)

题目传送门

这题.....看个标题和数据基本就能做了

首先要知道堆的性质,大根堆和小跟堆。而且堆构成的树是完全二叉树,所以可以用数组来标记孩子节点

输出路径,深搜下,先遍历右孩子,再遍历左孩子,然后到根节点输出路径即可

判断大根堆和小跟堆我是判断了两次,先判断是否是大根堆,在判断是否是小跟堆,判断方法就是遍历每个点,判断每个点是不是都满足堆得性质

#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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值