将一系列给定数字顺序插入一个初始为空的小顶堆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
作者: 陈越
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
分析:
1、小顶堆的父结点小于等于左右子结点。
2、判断很麻烦,仔细。
3、建堆不需要用二叉树(代码复杂且低效),直接数组。
代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97#include<bits/stdc++.h> using namespace std; int N,M,a[1001]; void Build(int n,int a[]) { for (int i=1;i<n;i++) { int j=i; while(j!=0&&a[(j-1)/2]>a[j]) { int c=a[j]; a[j]=a[(j-1)/2]; a[(j-1)/2]=c; j=(j-1)/2; } } } int findit(int w) { for (int i=0;i<N;i++) { if (w==a[i]) return i+1; } } int main() { cin>>N>>M; for (int i=0;i<N;i++) { cin>>a[i]; } Build(N,a); /*for (int i=0;i<N;i++) { cout<<a[i]<<' '; }*/ for (int i=0;i<M;i++) { int x,y; cin>>x; string s1; cin>>s1; if (s1=="and") { cin>>y; if (findit(x)/2==findit(y)/2) cout<<"T"<<endl; else cout<<"F"<<endl; string s2,s3; cin>>s2>>s3; } else { string s2; cin>>s2; if (s2=="a") { string s3,s4; cin>>s3>>s4>>y; if (findit(x)/2==findit(y)) { cout<<"T"<<endl; } else cout<<"F"<<endl; } else { string s3; cin>>s3; if (s3=="root") { if (findit(x)==1) { cout<<"T"<<endl; } else cout<<"F"<<endl; } else { string s4; cin>>s4>>y; if (findit(x)==findit(y)/2) { cout<<"T"<<endl; } else cout<<"F"<<endl; } } } } return 0; }
最后
以上就是阳光嚓茶最近收集整理的关于【小顶堆】关于堆的判断的全部内容,更多相关【小顶堆】关于堆内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复