zoukankan      html  css  js  c++  java
  • 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 ? " " : " ");

    二、参考代码

    #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 ? " " : "
    ");
    			}
    		}
    	}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;
    } 
    
  • 相关阅读:
    2012 regional 。。
    joj2443
    java笔记代码实现汉诺塔移动过程和移动次数
    java笔记增加虚拟机内存
    java笔记修改javadoc为中文API信息
    java笔记String类格式化当天日期转换符文档
    java笔记正则表达式的运用(包括电话,邮箱验证等)
    java笔记String类对象解析与运用
    Java笔记IO流的运用
    java笔记BigDecimal的使用
  • 原文地址:https://www.cnblogs.com/tsruixi/p/13196209.html
Copyright © 2011-2022 走看看