1147

#include 
#include 
using namespace std;
struct node{
	int v;
	node * r,*l;
};
int m,n,num = 0;
int level[1010];
void inorder(int i,node *& root){
	if(i > n) return;
	if(root == NULL){
		root = new node();
		root->v = level[i];
		root->r = root->l = NULL;
	}
	inorder(2*i,root->l);
	inorder(2*i+1,root->r);
}
bool ismax(node * root){
    if(root == NULL) return true;
	if((root->l != NULL)&&(root->v <= root->l->v) || (root->r != NULL)&&(root->v <= root->r->v))
	return false;
	return ismax(root->l) && ismax(root->r);
}
bool ismin(node * root){
    if(root == NULL) return true;
	if((root->l != NULL) &&(root->v >= root->l->v) || (root->r != NULL)&&(root->v >= root->r->v))
	return  false;
	return ismin(root->l) && ismin(root->r);
}
void post(node * root){
	if(root == NULL) return;
	post(root->l);
	post(root->r);
	printf("%d%s",root->v,num == n-1? "\n":" ");
	num++;
}
int main()
{
	scanf("%d %d",&m,&n);
	for(int i = 0; i < m; i++){
		for(int j = 1; j <= n; j++){
			scanf("%d",&level[j]);
		}
	    node * root = NULL;
	    inorder(1,root);
	    if(ismax(root)) printf("Max Heap\n");
	    else if(ismin(root)) printf("Min Heap\n");
		else  printf("Not Heap\n");
	    num = 0;
		post(root);
	}
	return 0; 
}
#include 
#include 
using namespace std;
int m,n,num = 0;
int level[1010];
void post(int i){
	if(i > n) return;
	post(i * 2);
	post(i * 2 + 1);
	printf("%d%s",level[i],i == 1? "\n":" ");
}
int main()
{
	scanf("%d %d",&m,&n);
	for(int i = 0; i < m; i++){
		for(int j = 1; j <= n; j++){
			scanf("%d",&level[j]);
		}
		int flag = level[1] > level[2] ? 1:-1;
		for(int j = 1; j <= n/2; j++){
			int l = j *2,r = j*2 + 1;
			if(flag == 1 && (level[l] > level[j] || (r <= n && level[r] > level[j]))  ) flag = 0;
			if(flag == -1 && (level[l] < level[j] || (r <= n && level[r] < level[j])) ) flag = 0;	
		}
		if(flag == 0)  printf("Not Heap\n");
	    else printf("%s Heap\n",flag == 1 ?"Max":"Min");
		post(1);
	}
	return 0; 
}

柳神29行代码搞定  没有建树 完全利用完全二叉树的性质 2i是做孩子 2i+1是右孩子 完全利用 for循环

你可能感兴趣的:(1147)