一、技术总结
- 这一题是关于堆的,主要学到的知识是使用深度遍历,遍历打印每一条路径,并且可以按照特定的顺序进行打印;
- 具体的dfs函数,对于堆而言,因为具备完全二叉树的特点,递归边界是index * 2 > n && index * 2 + 1, 同时会出现,按道理这时直接输出存储好的路径即可,但是因为题目中是说从右往左遍历,所以可能出现只含有最下层的一处,只含有左子树,没有右子树,那么这时就需要加上index <= n这个条件进行输出;
- 同时对于这种保存一条路径的记得要及时,将插入的结点pop_back()出来;
- 在一个判断是否为大堆还是小堆,直接对层序遍历保存结点从第二个结点开始往后遍历,如果出现当前结点比自己父结点大,那么这就不是大顶堆;如果比父节点小那么就不是小顶堆;
- 同时也学会了这样输出printf("%d%s", v[i], v.size() - 1 != i ? " " : "
");
二、参考代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int a[1009], n, isMin = 1, isMax = 1;
void dfs(int index){
if(index * 2 > n && index * 2 + 1 > n){
if(index <= n){
for(int i = 0; i <= v.size() - 1; i++){
printf("%d%s", v[i], i != v.size() - 1 ? " " : "
");
}
}
}else{
v.push_back(a[index * 2 + 1]);
dfs(index * 2 + 1);
v.pop_back();
v.push_back(a[index * 2]);
dfs(index * 2);
v.pop_back();
}
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
v.push_back(a[1]);
dfs(1);
for(int i = 2; i <= n; i++){
if(a[i/2] > a[i]) isMin = 0;
if(a[i/2] < a[i]) isMax = 0;
}
if(isMin == 1){
printf("Min Heap");
}else{
printf("%s", isMax == 1 ? "Max Heap" : "Not Heap");
}
return 0;
}