• 基础实验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
    ",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;
    }
    

      

    勤能补拙,熟能生巧
  • 相关阅读:
    数据库开发及ADO.NET
    C#典型案例及分析
    Visual Studio 2017 常用快捷键
    C#方法(函数)
    Linux常用命令----RPM包管理
    Linux常用命令----VIM命令
    Linux常用命令----压缩解压命令
    Linux常用命令----用户管理命令
    文件搜索命令
    Linux常用命令----权限管理命令
  • 原文地址:https://www.cnblogs.com/snzhong/p/12448202.html
Copyright © 2020-2023  润新知