DFS 1
# include <bits/stdc++.h>
using namespace std;
vector<int> T;
int N;
vector<int> path;
void DFS(int root) {
if(root > N) return;
if(root * 2 > N) {
path.push_back(root);
for(int i = 0;i < path.size();++i)
cout << T[path[i]] << (i == path.size()-1 ?"\n":" ");
path.pop_back();
return;
}
path.push_back(root);
DFS(root * 2 + 1);
path.pop_back();
path.push_back(root);
DFS(root * 2);
path.pop_back();
}
int main(){
cin >> N;
T.resize(N + 1);
for(int i = 1;i <= N;++i)
cin >> T[i];
bool isMaxHeap = is_heap(T.begin()+1, T.end());
bool isMinHeap = is_heap(T.begin()+1, T.end(), greater<int>());
DFS(1);
if(isMaxHeap) {
cout << "Max Heap\n";
} else
if(isMinHeap) {
cout << "Min Heap\n";
} else
if(!isMaxHeap && !isMinHeap) {
cout << "Not Heap\n";
}
return 0;
}
DFS 2
# include <bits/stdc++.h>
using namespace std;
vector<int> T;
int N;
vector<int> path;
void DFS(int root) {
if(root > N) return;
if(root * 2 > N) {
for(int i = 0;i < path.size();++i)
cout << T[path[i]] << (i == path.size()-1 ?"\n":" ");
return;
}
path.push_back(root * 2 + 1);
DFS(root * 2 + 1);
path.pop_back();
path.push_back(root * 2);
DFS(root * 2);
path.pop_back();
}
int main(){
cin >> N;
T.resize(N + 1);
for(int i = 1;i <= N;++i)
cin >> T[i];
bool isMaxHeap = is_heap(T.begin()+1, T.end());
bool isMinHeap = is_heap(T.begin()+1, T.end(), greater<int>());
path.push_back(1);
DFS(1);
if(isMaxHeap) {
cout << "Max Heap\n";
} else
if(isMinHeap) {
cout << "Min Heap\n";
} else
if(!isMaxHeap && !isMinHeap) {
cout << "Not Heap\n";
}
return 0;
}