目的:判断一棵完全二叉树是否是堆。
输入:
M <=100 被测试的树的数量
N 1<=N<=1000 每棵树节点的数量
然后是M行N个节点的树,序列是层序遍历的序列。
输出:
大堆
小堆
不是堆,然后输出后序遍历的序列。
算法:
用M,N分别存要测试的例子数和每棵树的节点数。
判断大堆一个函数,小堆一个函数。
若都不是,输出后序遍历。
后序遍历。先左子树,后右子树,再根节点。
对于层序遍历,vector存的话。从第1开始存,i的两个子节点应该是2i,2i+1。
#include<stdio.h>
#include<vector>
using namespace std;
int M,N;
vector<int> v;
bool ismaxheap()
{
for(int i=N;i>1;i--)
{
if(v[i]>v[i/2])
{
return false;
}
}
return true;
}
bool isminheap()
{
for(int i=N;i>1;i--)
{
if(v[i]<v[i/2])
{
return false;
}
}
return true;
}
void postorder(int now)
{
if(now>N) return;
postorder(2*now);
postorder(2*now+1);
printf("%d",v[now]);
if(now!=1)
{
printf(" ");
}
}
int main()
{
scanf("%d%d",&M,&N);
v.resize(N+1);
for(int i=0;i<M;i++)
{
for(int j=1;j<=N;j++)
{
scanf("%d",&v[j]);
}
if(ismaxheap())
{
printf("Max Heap\n");
}else if(isminheap())
{
printf("Min Heap\n");
}else
{
printf("Not Heap\n");
}
postorder(1);
printf("\n");
}
return 0;
}
反思:每次判断之后都要输出后序遍历的顺序。