题解
看了柳神的题解
用dfs去寻找路径,这个过程不是很难:
- 用先序遍历的方式
- 递归过程中记录节点,注意返回的时候需要pop
判断堆的类型,也比较简单,遍历一遍节点
我之前自己写的很麻烦,100行左右,对了22分。是去找最所有的叶子节点。然后通过叶子节点往上找。。我这,好麻烦。最后是两个超时,一个WA,WA的那个我知道是为啥了,也没再改。
#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
int N;
vector<int> path;
void dfs(int k)
{
if (k * 2 > N && k * 2 + 1 > N)
{
if (k <= N)
{
for (int i = 0; i < path.size(); i++)
{
printf("%d%s", path[i], i != path.size() - 1 ? " " : "\n");
}
}
}
else
{
path.push_back(v[k * 2 + 1]);
dfs(k * 2 + 1);
path.pop_back();
path.push_back(v[k * 2]);
dfs(k * 2);
path.pop_back();
}
}
int main()
{
cin >> N;
v.resize(N + 10);
for (int i = 1; i <= N; i++)
{
scanf("%d", &v[i]);
}
path.push_back(v[1]);
dfs(1);
int a, b;
a = b = 0;
for (int i = 2; i <= N; i++)
{
if (v[i / 2] > v[i])
a = 1;
else if (v[i / 2] < v[i])
b = 1;
}
if (a && b)
{
cout << "Not Heap";
}
else if (a)
{
cout << "Max Heap";
}
else
cout << "Min Heap";
return 0;
}