大一下半期数据结构
关于堆的判断
将一系列给定数字顺序插入一个初始为空的小顶堆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),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的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
题目解答:
-
#include<stdio.h> #include<string.h> int a[100000]={0},n,m; int Insert (int i); int zhaobaba (int s); int main(void) { int i,x,y; char str1[100],str2[100],str3[100],str4[100]; scanf ("%d %d",&n,&m); for (i=1;i<=n;i++) { scanf ("%d",&a[i]); if (i!=1) Insert (i); } getchar (); for (i=0;i<m;i++) { scanf ("%d %s",&x,str1); if (strcmp (str1,"and")==0) { scanf ("%d %s %s",&y,str2,str3); if (zhaobaba (x)==zhaobaba(y)) printf ("T\n"); else printf ("F\n"); } else { scanf ("%s %s",str2,str3); if (strcmp (str3,"root")==0) { if (x==a[1]) printf ("T\n"); else printf ("F\n"); } else if (strcmp (str3,"parent")==0) { scanf ("%s %d",str4,&y); if (zhaobaba (y)==x) printf ("T\n"); else printf ("F\n"); } else { scanf ("%s %d",str4,&y); if (zhaobaba (x)==y) printf ("T\n"); else printf ("F\n"); } } } return 0; } int Insert (int i) { int item; while (1) { if (i==1) break; else if (a[i]<a[i/2]) { item = a[i]; a[i] = a[i/2]; a[i/2] = item; i = i/2; } else break; } } int zhaobaba (int s) { int i; for (i=1;i<=n;i++) { if (a[i]==s) break; } return a[i/2]; }