現有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; }