完全二叉树可以用数组很好的表示,这题只用到堆的定义,关于堆的上滤、下滤操作等典型例程可以参照《数据结构与算法分析——C语言描述》系统复习。本题还考察如何根据完全二叉树的层序遍历来还原构建二叉树,以及后序遍历。
#include<stdio.h>
#include<queue>
#include<vector>
#include<stdlib.h>
using namespace std;
typedef struct Node* Tree;
struct Node
{
int key;
Tree left;
Tree right;
};
int heap[1000];
Tree construct(int N)
{
int size = 0;
queue<Tree> nodes;
Tree T = (Tree)malloc(sizeof(Node));
T->key = heap[size++];
T->left = T->right = NULL;
nodes.push(T);
while (nodes.empty() == false)
{
Tree tmp = nodes.front();
if (size < N)
{
Tree node = (Tree)malloc(sizeof(Node));
node->key = heap[size++];
node->left = node->right = NULL;
nodes.push(node);
tmp->left = node;
}
else break;
if (size < N)
{
Tree node = (Tree)malloc(sizeof(Node));
node->key = heap[size++];
node->left = node->right = NULL;
nodes.push(node);
tmp->right = node;
}
else break;
nodes.pop();
}
return T;
}
vector<int> postorder;
void postOrder(Tree T)
{
if (T->left != NULL)
{
postOrder(T->left);
}
if (T->right != NULL)
{
postOrder(T->right);
}
postorder.push_back(T->key);
}
int main()
{
int M, N;
scanf("%d%d", &M, &N);
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%d", &heap[j]);
}
bool isHeap = true;
if (heap[0] > heap[1])
{
for (int j = 0; j < N; j++)
{
int left = 2 * j + 1;
int right = 2 * j + 2;
if (left >= N) break;
else if (heap[left] > heap[j])
{
isHeap = false;
break;
}
if (right >= N) break;
else if (heap[right] > heap[j])
{
isHeap = false;
break;
}
}
if (isHeap)
{
printf("Max Heap\n");
}
else
{
printf("Not Heap\n");
}
}
else
{
for (int j = 0; j < N; j++)
{
int left = 2 * j + 1;
int right = 2 * j + 2;
if (left >= N) break;
else if (heap[left] < heap[j])
{
isHeap = false;
break;
}
if (right >= N) break;
else if (heap[right] < heap[j])
{
isHeap = false;
break;
}
}
if (isHeap)
{
printf("Min Heap\n");
}
else
{
printf("Not Heap\n");
}
}
Tree T = construct(N);
postorder.clear();
postOrder(T);
for (int j = 0; j < N; j++)
{
if (j == N - 1)
{
printf("%d\n", postorder[j]);
}
else
{
printf("%d ", postorder[j]);
}
}
}
return 0;
}