给出一个棵完全二叉树,输出其每一条从根到叶子节点的路径后(先输出右子树再输出左子树),判断是否是最大堆或最小堆,是最大堆(
>
=
>=
>=左右子树)输出Max Heap,最小堆输出Min Heap,不是堆输出Not Heap。
这一题实际上是遍历二叉树的问题,用深度优先搜索,用数组保存路径上的元素,等到叶子节点就输出(做对了输出路径,基本上这一题就做对了百分之九十)。判断是否最大或最小堆,可以在开头假定其是最大堆或最小堆(n>1,可以用根节点与一个子节点比较大小),再输出路径时去判断是否有不符合条件的。
(用时:44:05.30)
#include <bits/stdc++.h>
using namespace std;
int flag = 0;
void DFS(int heap[],int index,int n,int que[],int length)
{
que[length] = heap[index];
if(2*index+1>=n) {
for(int i=0; i<length+1; i++) {
if(i==0) {
printf("%d",que[i]);
} else {
printf(" %d",que[i]);
}
if(flag==2) {
if(i<length&&que[i]<que[i+1]) {
flag = 0;
}
} else if(flag == 1) {
if(i<length&&que[i]>que[i+1]) {
flag = 0;
}
}
}
printf("\n");
} else {
if(2*index+2<n) {
DFS(heap,2*index+2,n,que,length+1);
}
DFS(heap,2*index+1,n,que,length+1);
}
}
int main()
{
int n;
scanf("%d",&n);
int heap[n];
for(int i=0; i<n; i++) {
scanf("%d",&heap[i]);
}
if(heap[0]>=heap[1]) {
flag = 2;
} else {
flag = 1;
}
int que[n];
DFS(heap,0,n,que,0);
switch(flag) {
case 1:
printf("Min Heap\n");
break;
case 2:
printf("Max Heap\n");
break;
default:
printf("Not Heap\n");
break;
}
return 0;
}