PAT A 1147 AC代码(堆,大顶堆小顶堆判断,后序遍历)

本文介绍了一个C++程序,用于判断给定的数组是否构成最大堆或最小堆,并进行后序遍历。程序首先读取堆的大小和元素,然后通过递归函数检查是否满足堆的性质。如果满足最大堆或最小堆条件,程序将输出相应的堆类型;否则,输出'NotHeap'。接着,程序执行后序遍历并将结果输出。此代码适用于理解堆的数据结构和遍历方法。
摘要由CSDN通过智能技术生成

判断和后序遍历分别写成了两个单独函数。

按照堆的定义做即可。

#include<iostream>
#include<vector>
using namespace std;
vector<int> heap,post;
int M,N;
bool Max,Min;
void panduan(int index){
	if(index>N) return;
	if((2*index<=N&&heap[2*index]>heap[index])||(2*index+1<=N&&heap[2*index+1]>heap[index])){
		Max=false;
	}
	if((2*index<=N&&heap[2*index]<heap[index])||(2*index+1<=N&&heap[2*index+1]<heap[index])){
		Min=false;
	}
	panduan(2*index);
	panduan(2*index+1);
}
void Post(int index){
	if(index>N) return;
	Post(2*index);
	Post(2*index+1);
	post.push_back(heap[index]);
}
int main(){
	cin>>M>>N;
	for(int i=0;i<M;i++){
		heap.clear();
		post.clear();
		heap.resize(N+1);
		for(int j=1;j<=N;j++){
			scanf("%d",&heap[j]);
		}
		Max=true;Min=true;
		panduan(1);
		if(Max){
			printf("Max Heap\n");
		}else if(Min){
			printf("Min Heap\n");
		}else{
			printf("Not Heap\n");
		}
		Post(1);
		for(int j=0;j<N;j++){
			if(j==0){
				printf("%d",post[j]);
			}else{
				printf(" %d",post[j]);
			}
		}
		cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值