必须注意,因为题目要求按照插入的顺序建立,所以是边插入边调整的,必须用向上调整,每次输入一个数之后就将它向上调整。两者建立出来的二叉树不同,而不能采用先转换为二叉树的方式再向下调整。
这里的输入很巧妙~
#include
#include
#include
using namespace std;
const int N = 1010;
int n, m;
int h[N], p[N], s;
void up(int u)
{
while (u / 2 && h[u] < h[u / 2])
{
swap(h[u], h[u / 2]);
u >>= 1;
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> h[i];
up(i);
}
s = n;
while (m--) {
int a = 0, b = 0, x, y;
char s[20];
scanf("%d%s", &a, s);
if (!strcmp(s, "and")) {
scanf("%d%s%s", &b, s, s);
for (int i = 1; i <= n; i++) {
if (h[i] == a) x = i;
if (h[i] == b) y = i;
}
if (x / 2 == y / 2) cout << "T" << "\n";
else cout << "F" << "\n";
}
else {
scanf("%s", s);
if (!strcmp(s, "a")) {
scanf("%s%s%d", s, s, &b);
for (int i = 1; i <= n; i++) {
if (h[i] == a) x = i;
if (h[i] == b) y = i;
}
if (x / 2 == y) cout << "T" << "\n";
else cout << "F" << "\n";
}
else {
scanf("%s", s);
if (!strcmp(s, "root")) {
if (h[1] == a) cout << "T" << "\n";
else cout << "F" << "\n";
}
else {
scanf("%s%d", s, &b);
for (int i = 1; i <= n; i++) {
if (h[i] == a) x = i;
if (h[i] == b) y = i;
}
if (x == y / 2) cout << "T" << "\n";
else cout << "F" << "\n";
}
}
}
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)