问题描述:
一棵完全二叉树,如果其中的任意一棵子树的父亲节点的值都不小于它的孩子节点的值,我们称之为大顶堆; 相反,一棵完全二叉树,如果其中任意一棵子树的父亲节点的值都不大于它的孩子节点的值,我们称之为小顶堆。 对于一棵给定的二叉树,判断它是否是一个大顶堆,或者是一个小顶堆。 不考虑空树情况,树的结点至少有2个。 注意:输入只保证是二叉树,但不保证一定是一棵完全二叉树。
输入:
一棵完全二叉树,如果其中的任意一棵子树的父亲节点的值都不小于它的孩子节点的值,我们称之为大顶堆; 相反,一棵完全二叉树,如果其中任意一棵子树的父亲节点的值都不大于它的孩子节点的值,我们称之为小顶堆。 对于一棵给定的二叉树,判断它是否是一个大顶堆,或者是一个小顶堆。 不考虑空树情况,树的结点至少有2个。 注意:输入只保证是二叉树,但不保证一定是一棵完全二叉树。
输出:
输出一共有n行,分别对应输入的n棵二叉树。 如果是大顶堆,输出Max-heap. 如果是小顶堆,输出Min-heap. 如果既不是大顶堆也不是小顶堆,输出No.
输入样例:
3 1(2,3) 3(1,2) 2(1,3)
输出样例:
Min-heap. Max-heap. No.
代码:
#include<stdio.h>
#include<string.h>
int count;
void input(int a[])
{
int flag=0;
char str[300];
gets(str);
int index=1;
int i=0;
for(;str[i]!='(';i++){
a[1]=a[1]*10+str[i]-'0';
}
count=1;
for(;str[i]!='\0';i++){
if(str[i]=='('){
index=2*index;
flag=0;
}
else if(str[i]==')'){
index=index/2;
flag=0;
}
else if(str[i]==','){
index++;
flag=0;
}
else if(str[i]<='9' && str[i]>='0'){
if(flag==0){
count++;
}
flag=1;
a[index]=a[index]*10+str[i]-'0';
}
}
}
int judge_full_binary_tree(int a[])
{
for(int i=1;i<=count;i++){
if(a[i]==0 && a[i+1]!=0){
return 0;
}
}
return 1;
}
void judge_type_tree(int a[])
{
int i=1;
int maxflag=0,minflag=0;
for(;i<count/2;i++){
if(a[i]>= a[i*2] && a[i]>=a[i*2+1]){
maxflag++;
}
if(a[i]<= a[i*2] && a[i]<=a[i*2+1]){
minflag++;
}
}
if(count%2==1){
if(a[i]>= a[i*2] && a[i]>=a[i*2+1]){
maxflag++;
}
if(a[i]<= a[i*2] && a[i]<=a[i*2+1]){
minflag++;
}
}
else{
if(a[i]> a[i*2] ){
maxflag++;
}
if(a[i]< a[i*2] ){
minflag++;
}
}
//printf("maxflag=%d minflag=%d\n",maxflag,minflag);
if(maxflag==count/2){
printf("Max-heap.\n");
}
else if(minflag==count/2){
printf("Min-heap.\n");
}
else {
printf("No.\n");
}
}
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--){
int a[100]={0};
input(a);
//printf("count=%d\n",count);
if(judge_full_binary_tree( a )!=0){
judge_type_tree(a);
}
else{
printf("No.\n");
}
}
return 0;
}
以后再分析