A1155 Heap Paths (30分)

一、技术总结

  1. 这一题是关于堆的,主要学到的知识是使用深度遍历,遍历打印每一条路径,并且可以按照特定的顺序进行打印;
  2. 具体的dfs函数,对于堆而言,因为具备完全二叉树的特点,递归边界是index * 2 > n && index * 2 + 1, 同时会出现,按道理这时直接输出存储好的路径即可,但是因为题目中是说从右往左遍历,所以可能出现只含有最下层的一处,只含有左子树,没有右子树,那么这时就需要加上index <= n这个条件进行输出;
  3. 同时对于这种保存一条路径的记得要及时,将插入的结点pop_back()出来;
  4. 在一个判断是否为大堆还是小堆,直接对层序遍历保存结点从第二个结点开始往后遍历,如果出现当前结点比自己父结点大,那么这就不是大顶堆;如果比父节点小那么就不是小顶堆;
  5. 同时也学会了这样输出printf("%d%s", v[i], v.size() - 1 != i ? " " : "\n");

二、参考代码

#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int a[1009], n, isMin = 1, isMax = 1;
void dfs(int index){
	if(index * 2 > n && index * 2 + 1 > n){
		if(index <= n){
			for(int i = 0; i <= v.size() - 1; i++){
				printf("%d%s", v[i], i != v.size() - 1 ? " " : "\n");
			}
		}
	}else{	
		v.push_back(a[index * 2 + 1]);
		dfs(index * 2 + 1);
		v.pop_back();
		v.push_back(a[index * 2]);
		dfs(index * 2);
		v.pop_back();
	}
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
	}
	v.push_back(a[1]);
	dfs(1);
	for(int i = 2; i <= n; i++){
		if(a[i/2] > a[i]) isMin = 0;
		if(a[i/2] < a[i]) isMax = 0;
	}
	if(isMin == 1){
		printf("Min Heap");
	}else{
		printf("%s", isMax == 1 ? "Max Heap" : "Not Heap");
	}
	return 0;
} 

猜你喜欢

转载自www.cnblogs.com/tsruixi/p/13196209.html
今日推荐