pta ds 7-2 关于堆的判断 (25分)
将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:
x is the root:x是根结点;x and y are siblings:x和y是兄弟结点;x is the parent of y:x是y的父结点;x is a child of y:x是y的一个子结点。
输入格式:
每组测试第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; }

浙公网安备 33010602011771号