PAT甲组1155 Heap Paths 思路解析和代码

A1155

题目链接

个人思路

题意

给定完全二叉树层序序列,输出从根节点到所有叶子节点的路径(先输出右子节点),判断堆的类型

思路

  • dfs遍历树(要注意回溯,做完本题对dfs的反向操作有了更深的理解)
  • 输出路径的过程中判断大小堆

注意

由于大顶堆,小顶堆的根节点都有可能等于子节点,因此不能只判断heap[1]和heap[2]的大小,就断定是大顶堆还是小顶堆,最好使用while判断,但是测试点中并不涉及这方面的数据(题目说明是distinct,不相同的)

4
10 10 13 15
ans
10 13
10 10 15
Not Heap

4
10 10 9 8
ans
10 9
10 10 8
Max Heap

个人思路代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int N;
int heap[maxn];
vector<int> path;
int flag = -1;
void dfs(int root)
{
	if(root > N)
		return;
	if(2 * root + 1 > N && 2 * root > N)
	{
		path.push_back(heap[root]);
		for(int i = 0; i < path.size(); ++i)
		{
			if(i < path.size() - 1 && flag != -1)
			{
				int pare = path[i];
				int child = path[i + 1];
				if(flag == 1)//大顶堆 
				{
					if(child > pare)
						flag = -1;
				}
				else
				{
					if(child < pare)
						flag = -1;
				}
			}
			printf("%d", path[i]);
			if(i < path.size() - 1)
				printf(" ");
			else
				printf("\n");
		}
		path.pop_back();
		return;
	}
	path.push_back(heap[root]);
	dfs(2 * root + 1);
	path.pop_back();
	path.push_back(heap[root]);
	dfs(2 * root);
	path.pop_back();
}
int main(int argc, char *argv[]) {
	scanf("%d", &N);
	for(int i = 1; i <= N; ++i)
	{
		scanf("%d", &heap[i]);
	}
	int k = 2;
	while(flag == -1)
	{
		if(heap[1] > heap[k])
			flag = 1;
		else if(heap[1] == heap[2])
			k++;
		else
			flag = 2;
	}
	dfs(1);
	if(flag == -1)
		printf("Not Heap\n");
	else if(flag == 1)
		printf("Max Heap\n");
	else
		printf("Min Heap\n");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值