完全二叉树的顺序存储处理;
注意完全二叉树顺序存储的几个性质(设从0开始):
1.对结点i, 若有左孩子, 则下标为i * 2 + 1;若有右孩子,则下标为i * 2 + 2;
2.共N个结点, 则最后一个非叶子节点是第N/2(向下取整)个结点(下标为N/2-1);
???连续两次30分大题都是30行代码
#include <cstdio>
#include <vector>
using namespace std;
int M, N;
void PostOrder( vector<int> Tree, int t )
{
if( t < N )
{
PostOrder( Tree, t * 2 + 1 );
PostOrder( Tree, t * 2 + 2 );
printf("%d%s", Tree[t], t ? " ":"\n");
}
}
int main()
{
scanf("%d %d", &M, &N);
for( int i = 0; i < M; ++i )
{
vector<int> Tree(N);
int flagMax = 1, flagMin = 1;
for( int j = 0; j < N; ++j )
scanf("%d", &Tree[j]);
for( int t = 0, l, r; t < ( N + 1 ) / 2 && ( flagMax || flagMin ); ++t )
{
l = t * 2 + 1, r = t * 2 + 2;
if( Tree[t] < Tree[l] || ( r < N && Tree[t] < Tree[r] ) )
flagMax = 0;
if( Tree[t] > Tree[l] || ( r < N && Tree[t] > Tree[r] ) )
flagMin = 0;
}
if( !flagMax && !flagMin )
printf("Not Heap\n");
else printf("%s\n", flagMax ? "Max Heap":"Min Heap");
PostOrder( Tree, 0 );
}
}