简单的递归
#include<iostream>
#include<vector>
using namespace std;
int a[1001];
int isMin=1;
int isMax=1;
vector<int> v;
int n;
void dfs(int root)
{
//定义边界
if(2*root>n)
{
if(root<=n)
{
for(int i=0;i<v.size();i++)
//柳神的这个操作,牛逼大了
printf("%d%s",v[i],i!=v.size()-1?" ":"\n");
}
}
else
{
//传授一下递归密集,先一个一个试,试多几个然后就可以进行数学归纳法了。滑稽
//定义逻辑
v.push_back(a[2*root+1]);
//按右边输出
dfs(2*root+1);
v.pop_back();
v.push_back(a[2*root]);
dfs(2*root);
v.pop_back();
}
}
int main()
{
cin.tie(0);
cin>>n;
//建议从1开始,这样更有利于操作。当然不一定啦
for(int i=1;i<=n;i++)
cin>>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;
}
注:该题中为回溯的题目,之前笔者是想重计入每一个叶结点进行入手,但是无奈,没能成功。看柳神的操作下,发现题目还挺简单(虽然本人递归的条件已经写出来,但是没能打印成功)。
收获:已经学会如何使用数组进行静态建树,但是对于DFS了解不太够。DFS一定要多数形结合