为什么下面的算法VS2019给出的结果和PAT网页测试结果不一样?

新手上路,请多包涵

VS2019给出的结果(差别在于Max Heap和Min Heap)
PAT测试结果
题目链接: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.1k
1 个回答

编译时有2个warning

C:\Users\ADMIN\AppData\Local\JetBrains\CLion2021.2\cygwin_cmake\bin\cmake.exe --build /cygdrive/c/Users/ADMIN/CLionProjects/untitled/cmake-build-debug --target all -- -j 9
Scanning dependencies of target untitled
[ 50%] Building CXX object CMakeFiles/untitled.dir/main.cpp.o
/cygdrive/c/Users/ADMIN/CLionProjects/untitled/main.cpp: In function 'bool isMaxHeap1(int)':
/cygdrive/c/Users/ADMIN/CLionProjects/untitled/main.cpp:26:1: warning: control reaches end of non-void function [-Wreturn-type]
   26 | }
      | ^
/cygdrive/c/Users/ADMIN/CLionProjects/untitled/main.cpp: In function 'bool isMinHeap1(int)':
/cygdrive/c/Users/ADMIN/CLionProjects/untitled/main.cpp:36:1: warning: control reaches end of non-void function [-Wreturn-type]
   36 | }
      | ^
[100%] Linking CXX executable untitled.exe
[100%] Built target untitled

上述2个返回bool的函数可能没有返回值. 而这是一个undefined behavior
参考

所以编译器实现的差异导致了代码运行后的结果不同.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题