#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>path,a;
int n;
void dfs(int index){
//终止条件
if(index*2>n&&index*2+1>n){ //没有孩子结点
if(index<=n){ //该节点存在
for(int i=0;i<path.size();i++){ //打印路径
printf("%d%s",path[i],i!=path.size()-1?" ":"\n");
}
}
}else{ //递归主体
if(2*index+1<=n){ //右孩子存在
path.push_back(a[2*index+1]); // 存入右孩子
dfs(2*index+1); //遍历右子树
path.pop_back(); //弹出右孩子,回溯
}
if(2*index<=n){
path.push_back(a[2*index]);
dfs(2*index);
path.pop_back();
}
}
}
int main(){
int isMin=1,isMax=1;
cin>>n;
a.resize(n+1);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
path.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)printf("Min Heap");
else printf("%s",isMax==1?"Max Heap":"Not Heap");
system("pause");
return 0;
}
PAT 1155 Heap Paths (30 分) DFS+回溯判断堆
最新推荐文章于 2024-07-13 13:36:16 发布