• 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;
    } 
    
  • 相关阅读:
    jython 访问数据库的方法
    Server 2008安装FTP的简单教程
    如何实现Android重启应用程序代码 ?
    android 应用程序自适应屏幕大小
    Android Dialog用法
    2008Server错误
    7种形式的Android Dialog使用举例
    ADB使用方法
    调用手机震动
    android小记之FTP文件上传
  • 原文地址:https://www.cnblogs.com/tsruixi/p/13196209.html
Copyright © 2020-2023  润新知