写在前面
- 思路分析
- 深搜
(DFS)
打印所有路径(从右往左,即先序的镜像
),vector保存路径节点,通过push和
pop回溯,维护路径
-
index <= n
对只有左叶节点没有右叶节点特判
- 判断是否为堆:
- 从第2个节点开始遍历,比父节点⼩小,不是小顶堆
- 比父节点大,不是大顶堆
- 新知识点学习ing
- 第1遍
测试用例
input:
8
98 72 86 60 65 12 23 50
output:
98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap
intput:
8
8 38 25 58 52 82 70 60
output:
8 25 70
8 25 82
8 38 52
8 38 58 60
Min Heap
input:
8
10 28 15 12 34 9 8 56
output:
10 15 8
10 15 9
10 28 34
10 28 12 56
ac代码
- 参考链接
#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(); i++)
printf("%d%s", v[i], i!=v.size()-1 ? " " : "\n");
}
}
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;
// 下标1开始存储
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;
}
知识点小结
- 堆是1棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。
- 堆排序