PAT_A1155
PAT甲级1155.
目录
A1155
题目
样例
样例1
输入:
8
98 72 86 60 65 12 23 50
输出:
98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap
样例2
输入:
8
8 38 25 58 52 82 70 60
输出:
8 25 70
8 25 82
8 38 52
8 38 58 60
Min Heap
样例3
输入:
8
10 28 15 12 34 9 8 56
输出:
10 15 8
10 15 9
10 28 34
10 28 12 56
Not Heap
思路和坑点
思路:
使用库函数判断是不是堆,然后dfs获取路径,这里注意题目要求先右节点再左节点路径。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> v; //存放堆的各个顶点
vector<int> path; //存放路径
void getpath(int i);
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
scanf("%d",&n);
v.resize(n);
for(int i=0;i<n;i++) //读入堆的结点
scanf("%d",&v[i]);
getpath(0);
if(is_heap(v.begin(),v.end(),less<int>())) //使用stl中的函数判断堆
puts("Max Heap");
else if(is_heap(v.begin(),v.end(),greater<int>()))
puts("Min Heap");
else
puts("Not Heap");
return 0;
}
void getpath(int i){ //获取根到结点的路径
if(i*2+1>=n&&i<n){ //如果已经到了最后一层
path.push_back(v[i]); //加入最后一个叶子结点
for(int j=0;j<path.size();j++){ //输出路径
if(j) putchar(' ');
printf("%d",path[j]);
}
putchar('\n');
path.pop_back(); //回退一个元素返回到上一层
return;
}
else if(i>=n) return; //如果当前结点为空直接返回上一层
path.push_back(v[i]); //放入当前结点
getpath(i*2+2); //获取右子树叶子结点路径
getpath(i*2+1); //获取左子树叶子结点路径
path.pop_back(); //回退一个元素返回到上一层
}