PAT A1155 Heap Paths (30 分)
原题链接
- 大致题意
- 思路
- AC代码
1、大致题意
输入完全二叉树,先输出从根节点到叶子结点的路径(先右子树再左子树),然后判断是大根堆还是小根堆
2、思路
给个例子
98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap
分为两个部分:
(1)递归打印路径
(2)判断大根堆,小根堆
Step 1
递归打印路径——DFS
Step 2
判断大根堆,小根堆
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,a[maxn];
vector<int>v;
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()
{
#ifdef ONLINE_JUDGE
#else
{
freopen("12.txt","r",stdin);
}
#endif
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
v.push_back(a[1]);
dfs(1);//打印路径
int isMin=1,isMax=1;
for(int i=2;i<=n;i++)
{
if(a[i/2]<a[i])isMax=0;
if(a[i/2]>a[i])isMin=0;
}
if(isMax==1)
{
cout<<"Max Heap\n";return 0;
}
if(isMin==1)
{
cout<<"Min Heap\n";return 0;
}
if(isMin==0&&isMax==0)
{
cout<<"Not Heap\n";return 0;
}
return 0;
}
喵~