题目:
题目大意: 给一个二叉树判断是否是最大或最小堆. 这道题考察的知识点是递归和dfs, 通过一次深度优先的遍历就可以把所有路径找出来, 每找出一个路径就判断一下是不是递减, 是不是递增.
注意递归题目中, 重点关注边界条件–到达叶节点, 递归式–最小堆的数组存储, 从1开始, 第i个元素的左儿子是i2, 右儿子是2i + 1.
#include<cstdio>
#include<iostream>
#include<vector>
#define pb push_back
using namespace std;
int tree[1005];
int n;
bool max_flag = true, min_flag = true;
vector<int> temp_path;
void dfs(int i) {
temp_path.pb(tree[i]);
if ( i * 2 > n) {
for(int i = 0; i < temp_path.size(); i++) {
printf("%d", temp_path[i]);
if (i > 0) {
if (max_flag)
max_flag = temp_path[i-1] >= temp_path[i];
if (min_flag)
min_flag = temp_path[i-1] <= temp_path[i];
}
if (i + 1 != temp_path.size()) printf(" ");
else printf("\n");
}
}
else {
if (i * 2 + 1 <= n) dfs(i * 2 + 1);
if (i * 2 <= n) dfs(i * 2);
}
temp_path.pop_back();
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &tree[i]);
}
dfs(1);
if (max_flag) printf("Max Heap");
else if (min_flag) printf("Min Heap");
else printf("No Heap");
system("pause;");
return 0;
}