题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/1071785408849047552
题目大意:给出一颗完全二叉树,打印出从根节点到所有叶节点的路径,打印顺序先右后左,即先序遍历的镜像。然后判断该树是大顶堆、小顶堆或者不是堆~
思路:dfs遍历,遇到叶子结点输出路径,用栈存路径
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
int n;
int vis[maxn];//标记数组
int a[maxn];
int st[maxn]; //模拟栈
int k;
int cnt1; //判断是否是大顶堆
int cnt2; //判断是否是小顶堆
void print(int k)
{
for(int i=0; i<k; i++)//打印路径
{
if(i==0)
printf("%d",a[st[i]]);
else
printf(" %d",a[st[i]]);
}
for(int i=1; i<k; i++) //小顶堆判断
{
if(a[st[i]]>=a[st[i-1]])
cnt2 = 1;
}
for(int i=1; i<k; i++) //大顶堆判断
{
if(a[st[i]]<=a[st[i-1]])
cnt1 = 1;
}
printf("\n");
}
void dfs(int s)
{
vis[s] = 1;
st[k++] = s;
if(s*2>n) //当s*>n时说明该节点是叶子节点,因为堆是一颗完全二叉树
{
print(k);
}
if(s*2+1<=n) //右子树递归
{
dfs(s*2+1);
k--;
}
if(s*2<=n) //左子树递归
{
dfs(s*2);
k--;
}
}
int main()
{
scanf("%d",&n);
int i;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
k = 0;
cnt1 = 0;
cnt2 = 0;
dfs(1);
if(cnt1&&cnt2)
printf("Not Heap");
else if(cnt1)
printf("Max Heap\n");
else if(cnt2)
printf("Min Heap\n");
return 0;
}