PAT1147 Heap

原题链接:PAT1147

解析:这题应该就是简单的堆模拟,如果看得懂英文题意的话不算难。我的做法利用了二叉树的一个性质,即从上往下从左往右依次为节点编号为0,1,2....,那么第i个节点的左子节点编号为2*i+1,右子节点2*i+2。

我第一次没通过的原因:刚开始我判断循环条件为2*i+2 < n,这样就有个问题,如果2*i+i < n但是2*i+2 > n就漏判了一个2*i+1。

代码实例:

#include<iostream>
using namespace std;
int num[1005];
int n,m;
bool isMax(){
	for(int i = 0;2*i+1 < n;i++){
		if(2*i+2 >= n)
			if(num[i] < num[2*i+1])	return false;
		if(2*i+2 < n)
			if(num[i] >= num[2*i+1] && num[i] >= num[2*i+2]);
			else return false;
	}
	return true;
}
bool isMin(){
	for(int i = 0;2*i+1 < n;i++){
		if(2*i+2 >= n)
			if(num[i] > num[2*i+1])	return false;
		if(2*i+2 < n)
			if(num[i] <= num[2*i+1] && num[i] <= num[2*i+2]);
			else return false;
	}
	return true;
}
void Print(int k){
	if(k >= n)	return;
	Print(2*k+1);
	Print(2*k+2);
	if(k == 0)	cout << num[k] << endl;
	else cout << num[k] << " ";
}
int main()
{
	cin >> m >> n;
	while(m--){
		for(int i = 0;i < n;i++)	cin >> num[i];
		int flag = 0;
		if(isMax())	flag = 1;
		if(isMin())	flag = 2;
		if(flag == 1)	cout << "Max Heap" << endl;
		else if(flag == 2)	cout << "Min Heap" << endl;
		else	cout << "Not Heap" << endl;
		Print(0);
	}
	return 0;
}

 

posted @ 2018-08-19 20:34  Dr_Lo  阅读(101)  评论(0编辑  收藏  举报