现有M个查询,每个查询给定一个长度为N的彻底二叉树层序序列,判断该二叉树是大根堆,小根堆和非堆,而后输出该彻底二叉树的后序遍历序列。算法
对于彻底二叉树能够使用一个数组来保存其层序序列,而后使用函数isMaxHeap和isMinHeap分别判断该彻底二叉树是不是大根堆仍是小根堆,若是都不是则输出Not Heap,而后再使用postTraverse对该彻底二叉树进行后序遍历,访问节点的时候输出节点便可。数组
// 判断是不是大根堆 bool isMaxHeap(){ for (int i = 1; i <= N; ++i) { if((2*i<=N&&heap[2*i]>heap[i])||(2*i+1<=N&&heap[2*i+1]>heap[i])){ return false; } } return true; }
// 判断是不是小根堆 bool isMinHeap(){ for (int i = 1; i <= N; ++i) { if((2*i<=N&&heap[2*i]<heap[i])||(2*i+1<=N&&heap[2*i+1]<heap[i])){ return false; } } return true; }
#include<cstdio> using namespace std; int heap[1005]; int M,N; // 判断是不是大根堆 bool isMaxHeap(){ for (int i = 1; i <= N; ++i) { if((2*i<=N&&heap[2*i]>heap[i])||(2*i+1<=N&&heap[2*i+1]>heap[i])){ return false; } } return true; } // 判断是不是小根堆 bool isMinHeap(){ for (int i = 1; i <= N; ++i) { if((2*i<=N&&heap[2*i]<heap[i])||(2*i+1<=N&&heap[2*i+1]<heap[i])){ return false; } } return true; } int num;// 控制空格输出 void postTraverse(int root){ if(root>N) return; postTraverse(2*root); postTraverse(2*root+1); printf("%d",heap[root]); if(num<N-1) printf(" "); ++num; } int main(){ scanf("%d %d",&M,&N); for (int i = 0; i < M; ++i) { // M次查询 num = 0;// 每次都得赋值为0 for (int j = 1; j <= N; ++j) { scanf("%d",&heap[j]); } if(isMinHeap()){ printf("Min Heap\n"); } else if(isMaxHeap()){ printf("Max Heap\n"); } else { printf("Not Heap\n"); } postTraverse(1); printf("\n");// 记得换行 } return 0; }