pta ds 7-2 关于堆的判断 (25分)

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:

  • x is the rootx是根结点;
  • x and y are siblingsxy是兄弟结点;
  • x is the parent of yxy的父结点;
  • x is a child of yxy的一个子结点。

输入格式:

每组测试第1行包含2个正整数N≤ 1000)和M≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。

输出格式:

对输入的每个命题,如果其为真,则在一行中输出T,否则输出F

输入样例:

5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10
 

输出样例:

F
T
F
T
 
作者
陈越
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

 

 
#include<stdio.h>
#include<stdlib.h> 
typedef int ElementType;
typedef struct HNode *Heap;
struct HNode {
    ElementType *Data; /* 存储元素的数组 */
    int Size;          /* 堆中当前元素个数 */
    int Capacity;      /* 堆的最大容量 */
};
typedef Heap MinHeap; /* 最小堆 */

#define MINDATA -20000

MinHeap CreateHeap(int MaxSize){
    MinHeap H = NULL;
    H = (MinHeap)malloc(sizeof(struct HNode));
    H->Capacity = MaxSize;
    H->Data = (ElementType*)malloc(sizeof(ElementType)*(MaxSize+1));
    H->Size = 0 ;
    H->Data[0] = MINDATA;
    return     H; 
}

int Insert(MinHeap H,ElementType X)
{
    if(H->Size == H->Capacity)return 0;
    int i = ++H->Size;
    for(;H->Data[i/2] > X;i/=2){
        H->Data[i] = H->Data[i/2];
    }
    H->Data[i] = X;
    return 1;
}

MinHeap MakeHeap(MinHeap H,int n){
    ElementType x;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&x); 
        Insert(H,x);
    }
    return H;
}

void PrintHeap(MinHeap H)
{
    for(int i=1;i<=H->Size;i++)
    {
        printf("%d ",H->Data[i]);
    }
}

int FindPostion(MinHeap H,ElementType x){
    for(int i=1;i<=H->Size;i++)
    {
        if(H->Data[i] == x)return i;
    }
    return -1;
}

void Judge(MinHeap H,int m)
{
    int first_num;
    int second_num;
    int first_pos;
    int second_pos;
    char ops[20];
    for(int i = 0;i < m;i++)
    {
        scanf("%d",&first_num);
        scanf("%s",ops);
        if(ops[0]=='a'){
            scanf("%d",&second_num);
            scanf("%s",ops);
            scanf("%s",ops);
            first_pos = FindPostion(H,first_num);
            second_pos = FindPostion(H,second_num);
            if(first_pos == -1 || second_pos == -1)printf("F\n");
            else {
                if(first_pos/2 == second_pos/2 )printf("T\n");
                else printf("F\n");
            }
        }
        else 
        {
            scanf("%s",ops);
            if(ops[0]=='a'){
                scanf("%s",ops);
                scanf("%s",ops);
                scanf("%d",&second_num);
                first_pos = FindPostion(H,first_num);
                second_pos = FindPostion(H,second_num);
                if(first_pos == -1 || second_pos == -1)printf("F\n");
                else {
                    if(first_pos/2 == second_pos )printf("T\n");
                    else printf("F\n");
                }
            }
            else
            {
                scanf("%s",ops);
//                scanf("%s",ops);
                if(ops[0]=='r')
                {
                    first_pos = FindPostion(H,first_num);
                    if(first_pos == 1 )printf("T\n");
                    else printf("F\n");
                }
                else
                {
                    scanf("%s",ops);
                    scanf("%d",&second_num);
                    first_pos = FindPostion(H,first_num);
                    second_pos = FindPostion(H,second_num);
                    if(first_pos == -1 || second_pos == -1)printf("F\n");
                    else {
                        if(first_pos == second_pos/2 )printf("T\n");
                        else printf("F\n");
                    }
                }
            }
        }
    }
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    MinHeap H = CreateHeap(n);
    H = MakeHeap(H,n);
//    PrintHeap(H);
    Judge(H,m); 
    return 0;
 } 

 

 

posted on 2020-11-07 16:52  xwwer  阅读(282)  评论(0)    收藏  举报