1147 Heaps (30 分)
阿新 • • 發佈:2018-12-15
#include<bits/stdc++.h> using namespace std; const int MAXN=1003; struct Node{ int data; Node* left; Node* right; }; vector<int> pos,temp; int m,n; int flag=0; void postra(Node* root){//後序輸出 if(root==NULL) return; postra(root->left); postra(root->right); pos.push_back(root->data); } Node* prebuild(int x){//建樹並檢查是否符合堆的特點 if(x>n) return NULL; Node* root=new Node; root->data=temp[x]; root->left=NULL;root->right=NULL; if(x*2<=n) root->left=prebuild(x*2); if(x*2+1<=n) root->right=prebuild(x*2+1); if(root->left&&root){ if(flag==1&&(root->data<root->left->data)) flag=0; if(flag==-1&&(root->data>root->left->data)) flag=0; } if(root->right&&root){ if(flag==1&&(root->data<root->right->data)) flag=0; if(flag==-1&&(root->data>root->right->data)) flag=0; } return root; } int main() { freopen("in.txt","r",stdin); cin>>m>>n; for(int i=0;i<m;i++){ vector<int> ppp;ppp.resize(n+1); for(int j=1;j<=n;j++){ cin>>ppp[j]; } temp=ppp; if(ppp[1]>ppp[2]) flag=1; if(ppp[1]<ppp[2]) flag=-1; Node* root=prebuild(1); if(flag==1) cout<<"Max Heap"<<endl; if(flag==-1) cout<<"Min Heap"<<endl; if(flag==0) cout<<"Not Heap"<<endl; postra(root); for(int j=0;j<n;j++){ if(j==0) cout<<pos[j]; else cout<<' '<<pos[j]; } cout<<endl; pos.clear(); temp.clear(); flag=0; } return 0; }
這道題並沒有考察堆排序,也不用寫往上和往下調整兩段程式碼,關鍵是建樹(層序建樹)的同時檢查~