PAT甲级 1147 Heaps (30分) 后序遍历+堆的判断/C++

1147 Heaps (30分)

题目大意:给定一个完全二叉树的层序遍历,要求判断其是否为堆,并输出后序遍历结果。

判断是否为堆,先确定为最大堆还是最小堆(比较开始的两个元素),再比较各个元素与其左右孩子的大小关系。

柳婼大神只用了25行代码解决!(传送门,学到了,还是要多看看大神的题解哒~)

#include<iostream>                  //输入输出流头文件
#include<vector>                    //变长数组容器
using namespace std;               //标准命名空间
int m,n,ismaxHeap=1;
vector<int> v,postorder;
int isHeap();
void postOrder(int r);
int main(){                         //主函数
#ifdef ONLINE_JUDGE                 //如果有oj系统(在线判定),则忽略文件读入,否则使用文件作为标准输入
#else    
   freopen("1.txt", "r", stdin);   //从1.txt输入数据
#endif 
   cin>>m>>n;
   v.resize(n);
   for(int i=0;i<m;i++){
	   for(int j=0;j<n;j++){
		   cin>>v[j];
	   }
	   if(v[0]<v[1]) ismaxHeap=0;
	    if(isHeap())cout<<(ismaxHeap?"Max Heap":"Min Heap")<<endl;
		else cout<<"Not Heap"<<endl;
		postOrder(0);
		for(int k=0;k<n;k++){
			cout<<postorder[k];
			if(k<n-1)cout<<' ';
			else {cout<<endl;postorder.clear();}
		}
		ismaxHeap=1;
   }
    return 0;                       //返回0,如果不返回0,PAT会报错
}
bool notHeap(int fa,int ch){
	if(ismaxHeap==1) return ch>fa;//如果是最大堆且孩子大于父亲
	else return ch<fa;
}
int isHeap(){
	for(int i=0;i*2+1<n;i++){
		if(notHeap(v[i],v[i*2+1])){return 0;}
		if(i*2+2<n){
			if(notHeap(v[i],v[i*2+2])){return 0;}
		}
	}
    return 1;
}
void postOrder(int r){
	if(r>=n)return ;
	postOrder(r*2+1);
	 postOrder(r*2+2);
	postorder.push_back(v[r]);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值