1147 Heaps (30分)/完全二叉树和堆的性质

题目描述

在这里插入图片描述在这里插入图片描述

题目大意

给定一个完全二叉树的层序遍历,判断它是大顶堆/小顶堆/不是堆,并给出其后序遍历序列。

分析

没有特别好的思路,去看了柳神的思路,太强了~~
  首先,完全二叉树的下标可以按照如下形式,其中树的根节点下标为1。那么对于树的任意一个结点来说,其孩子结点的Index与它的index有着如下关系。堆的定义是对于完全二叉树的每个结点,不小于(大顶堆)或不大于(小顶堆)其孩子结点。

在这里插入图片描述
  那么,我们对树的每个结点进行判断,如果所有结点均小于其父亲结点(除根节点),那么它就是一个大顶堆。如果所有结点均大于其父亲结点(除根节点),那么它就是一个小顶堆。如果都不满足,那么就不是一个堆。
  通过上图的关系,给定任意index为x,可以很简单的确定其父结点index为x/2

AC代码

ps: 这个代码太棒了,不得不膜拜大佬~

#include<iostream>
#include<vector>
using namespace std;
int m, n;
vector<int> v;
void postOrder(int index) {
	if (index > n) return;
	postOrder(index * 2);
	postOrder(index * 2 + 1);
	printf("%d%s", v[index], index == 1 ? "\n" : " ");
}
int main() {
	cin >> m >> n;
	v.resize(n + 1);
	while (m--) {
		for (int i = 1; i <= n; i++) scanf("%d", &v[i]);
		bool ismax = 1, ismin = 1;
		for (int i = 2; i <= n; i++) {
			if (v[i] > v[i / 2]) ismax = 0;
			if (v[i] < v[i / 2]) ismin = 0;
		}
		if (ismax) printf("Max Heap\n");
		else if (ismin) printf("Min Heap\n");
		else printf("Not Heap\n");
		postOrder(1);
	}
	return 0;
}
发布了103 篇原创文章 · 获赞 9 · 访问量 4699

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104417664