题目链接:https://pintia.cn/problem-set...
题目要求是根据完全二叉树的层序序列判断是大根堆还是小根堆,亦或不是堆,并输出它的后序序列。
下面是源代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
vector<int>level;
vector<int>res;
bool isMaxHeap1(int i) {
if (2 * i > n)return true;
if (!isMaxHeap1(2 * i) || level[i] < level[2 * i])return false;
if (2 * i + 1 > n)return true;
if (!isMaxHeap1(2 * i + 1) || level[i] < level[2 * i + 1])return false;
}
bool isMinHeap1(int i) {
if (2 * i > n)return true;
if (!isMinHeap1(2 * i) || level[i] > level[2 * i])return false;
if (2 * i + 1 > n)return true;
if (!isMinHeap1(2 * i + 1) || level[i] > level[2 * i + 1])return false;
}
void postOrderTraverse(int root) {
if (root > n)return;
postOrderTraverse(2 * root);
postOrderTraverse(2 * root + 1);
res.push_back(level[root]);
}
int main() {
int m;
cin >> m >> n;
level.resize(n + 1);
for (int i = 0; i < m; i++) {
fill(level.begin(), level.end(), 0);
res.clear();
for (int j = 1; j <= n; j++)
cin >> level[j];
if (isMaxHeap1(1))
printf("%s", "Max Heap\n");
else if (isMinHeap1(1))
printf("%s", "Min Heap\n");
else
printf("%s", "Not Heap\n");
postOrderTraverse(1);
for (int j = 0; j < res.size(); j++)
printf("%s%d", j != 0 ? " " : "", res[j]);
cout << endl;
}
}
编译时有2个warning
上述2个返回bool的函数可能没有返回值. 而这是一个undefined behavior
参考
所以编译器实现的差异导致了代码运行后的结果不同.