基础实验4-2.5 关于堆的判断 (25分)---建小顶堆

 

 

 

 解题思路:

1、边输入边建小顶堆(下标从1开始)

2、判断

     1)、根结点则下标为1

     2)、若为兄弟结点,则两者双亲结点相同

     3)、儿子结点下标/2=双亲结点下标(注意:用 ‘/‘ 不用 ’*‘)

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define Max 1010
int arr[2]= {0};
int n,m;
void Adjust(int a[],int k,int n) {//向下调整堆
	a[0]=a[k];
	int i;
	for(i=2*k; i<=n; i*=2) {
		if(i<n&&a[i]>a[i+1])
			i++;
		if(a[0]<=a[i])break;
		else {
			a[k]=a[i];
			k=i;
		}
	}
	a[k]=a[0];
}
void BuildHeap(int a[],int n) {//建小顶堆
	int i;
	for(i=n/2; i>0; i--) {
		Adjust(a,i,n);
	}
}
int find(int tmp,int a[]) {//获取下标
	int i;
	for(i=1; i<=n; i++) {
		if(a[i]==tmp) {
			return i;
		}
	}
    return -1;
}
void Out(int tag,int a[]) {//判断命题
	int i;
	int flag=0;
	if(tag==1) {
		if(find(arr[0],a)==1)
			flag=1;
	} else if(tag==2) {
		if(find(arr[0],a)/2==find(arr[1],a)/2)
			flag=1;
	} else if(tag==3) {
		if(find(arr[1],a)/2==find(arr[0],a))
			flag=1;
	} else if(tag==4) {
		if(find(arr[1],a)==find(arr[0],a)/2)
			flag=1;
	}
	printf("%c\n",flag?'T':'F');
}

int main() {

	scanf("%d %d",&n,&m);
	int * a=(int *)malloc(sizeof(int)*Max);
	int i;
	for(i=1; i<=n; i++) {
		scanf("%d",&a[i]);
		BuildHeap(a,i);
	}
	char c[10],c1[10],c2[10];
	int tag;
	for(i=0; i<m; i++) {//字符处理
		scanf("%d %s",&arr[0],&c);
		if(!strcmp(c,"and")) {
			tag=2;
			scanf("%d %s%s",&arr[1],&c1,&c2);
			Out(tag,a);
			continue;
		}
		scanf("%s",&c);
		if(!strcmp(c,"a")) {
			tag=4;
			scanf("%s%s%d",&c1,&c2,&arr[1]);
			Out(tag,a);
			continue;
		}
		scanf("%s",&c);
		if(!strcmp(c,"parent")) {
			tag=3;
			scanf("%s%d",&c1,&arr[1]);
			Out(tag,a);

			continue;
		}
		if(!strcmp(c,"root")) {
			tag=1;
			Out(tag,a);
			continue;
		}

	}
	return 0;
}

  

 

posted @ 2020-03-09 13:17  跃鱼  阅读(602)  评论(0编辑  收藏  举报