PAT——1155 Heap Paths 甲级(内含题意与详细思路解析)

题目

https://pintia.cn/problem-sets/994805342720868352/problems/1071785408849047552

题意

打印该树所有从根节点到叶子节点的路径(先右后左),然后判断该树是大顶堆、小顶堆或者不是顶堆

思路

层序数组的特点(知者可跳)

首先我们要知道,按层序输出的数组有如下特点(下标从1开始),假设根节点的下标为root,那么它的左子节点的下标为root * 2,右子节点的下边为root * 2+1,下面我来举一个例子:

下标12345678910
数值6381549024

画出来的树如下:
请添加图片描述

当root=1时(值为6),它的左子节点的下标为1 * 2=2(值为3),它的右子节点的下标为1 * 2+1=3(值为8)
当root=4时(值为1),它的左子节点的下标为4 * 2=8(值为0),它的右子节点的下标为4 * 2+1=9(值为2)

所以说,这就是层序顺序的数组所包含的规律,大家尽量掌握一下

详细思路

在了解到上述知识点后,我们按照层序的关系,将每一层与上一层比较,都满足大于等于的关系就是小顶堆,都满足小于等于的关系就是大顶堆,否则不是顶堆

然后我们利用dfs的基本思想,按层从右到左遍历数组,每一层对应最终数组ans的一个下标,当root*2>n时(没有左子节点,表示自己就是叶子节点)直接输出即可

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,a[1001],flag=0,cnt=0; 
int ans[1001];
void dfs(int index,int root)
{
	ans[index]=a[root];
	if(root*2>n)
	{
		for(int i=1;i<=index;i++)
		{
			if(i==1) cout<<ans[i];
			else cout<<" "<<ans[i];
		}
		cout<<endl;
		return;
	}
	for(int i=root*2+1;i>=root*2;i--)
	{
		if(i>n) continue;
		dfs(index+1,i);
	}
}
int main()
{
	cin>>n;
	int i;
	for(i=1;i<=n;i++)
		cin>>a[i];		
	
	for(i=2;i<=n;i++)//判断小堆 
		if(a[i]<a[i/2])	break;
	if(i==n+1) flag=1;	
	
	for(i=2;i<=n;i++)//判断大堆 
		if(a[i]>a[i/2])	break;
	if(i==n+1) flag=2;
	
	dfs(1,1);	
	
	if(flag==1) cout<<"Min Heap";
	else if(flag==2) cout<<"Max Heap";
	else cout<<"Not Heap"; 
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值