A1155
个人思路
题意
给定完全二叉树层序序列,输出从根节点到所有叶子节点的路径(先输出右子节点),判断堆的类型
思路
- dfs遍历树(要注意回溯,做完本题对dfs的反向操作有了更深的理解)
- 输出路径的过程中判断大小堆
注意
由于大顶堆,小顶堆的根节点都有可能等于子节点,因此不能只判断heap[1]和heap[2]的大小,就断定是大顶堆还是小顶堆,最好使用while判断,但是测试点中并不涉及这方面的数据(题目说明是distinct,不相同的)
4
10 10 13 15
ans
10 13
10 10 15
Not Heap
4
10 10 9 8
ans
10 9
10 10 8
Max Heap
个人思路代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int N;
int heap[maxn];
vector<int> path;
int flag = -1;
void dfs(int root)
{
if(root > N)
return;
if(2 * root + 1 > N && 2 * root > N)
{
path.push_back(heap[root]);
for(int i = 0; i < path.size(); ++i)
{
if(i < path.size() - 1 && flag != -1)
{
int pare = path[i];
int child = path[i + 1];
if(flag == 1)//大顶堆
{
if(child > pare)
flag = -1;
}
else
{
if(child < pare)
flag = -1;
}
}
printf("%d", path[i]);
if(i < path.size() - 1)
printf(" ");
else
printf("\n");
}
path.pop_back();
return;
}
path.push_back(heap[root]);
dfs(2 * root + 1);
path.pop_back();
path.push_back(heap[root]);
dfs(2 * root);
path.pop_back();
}
int main(int argc, char *argv[]) {
scanf("%d", &N);
for(int i = 1; i <= N; ++i)
{
scanf("%d", &heap[i]);
}
int k = 2;
while(flag == -1)
{
if(heap[1] > heap[k])
flag = 1;
else if(heap[1] == heap[2])
k++;
else
flag = 2;
}
dfs(1);
if(flag == -1)
printf("Not Heap\n");
else if(flag == 1)
printf("Max Heap\n");
else
printf("Min Heap\n");
return 0;
}