PAT A1155 Heap Paths
- 判断大小堆or not,并输出顶点到叶子的所有路径,右边的优先(dfs先递归右子树)
- 层序是堆的好搭档,为方便计算,下标从1开始。输入后比较前两个元素(即顶点与其子的大小),定下堆的整体感情基调。因为要输出路径,这里选择了dfs,对于每个顶点root,右孩子为root * 2 + 1,左孩子为root * 2。if存在右孩子或者左孩子,则比较大小,判断与整体的基调是否相符,并向下递归;if没有孩子,即到达了叶子,则可以输出路径
- 感情出现变化则不是堆
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5582067aef6b0cbc11b935f2e4cd73bc.jpeg)
#include<iostream>
#include<vector>
using namespace std;
vector<int> lvorder,path;
int N;
bool min_flag,flag = true;
void dfs(int root){
path.push_back(lvorder[root]);
if(root * 2 + 1 <= N){
if((lvorder[root] < lvorder[root * 2 + 1]) != min_flag) flag = false;
dfs(root * 2 + 1);
}
if(root * 2 <= N){
if((lvorder[root] < lvorder[root * 2]) != min_flag) flag = false;
dfs(root * 2);
}
else{
for(int i = 0;i < path.size();i ++){
cout << path[i];
if(i != path.size() - 1) cout << ' ';
else cout << endl;
}
}
path.pop_back();
}
int main(){
cin >> N;
lvorder.resize(N + 1);
for(int i = 1;i <= N;i ++) cin >> lvorder[i];
min_flag = (lvorder[1] < lvorder[2]);
dfs(1);
if(flag) cout << (min_flag ? "Min Heap" : "Max Heap");
else cout << "Not Heap";
return 0;
}