zoukankan      html  css  js  c++  java
  • A1147 Heaps (30分)

    一、技术总结

    1. 这一题是关于堆排序的问题。
    2. 先理解啥是堆,也就是一棵完全二叉树,但是还有附加要求,如果满足每个结点的左右子树的结点值都小于自己称为大顶堆;如果是每个结点的左右子树值都大于自己,称为小顶堆。
    3. 所以解决该问题可以应用完全二叉树的一些知识点。
    4. 这一题是给出每棵树的层序遍历,这是满足结点下标是刚刚按照顺序从小到大,需要我们判断每课树是否为堆,同时输出每课树的后序遍历。
    5. 我们首先应该判断该树是否为堆,因为具有完全二叉树的特质,我们只需要遍历[0, (n-1)/2)]下标,判断左右子树跟自己的关系即可,因为其他的是叶子结点,无需判断;
    6. 最后就是后序遍历函数的编写,利用递归的思想,递归边界为index下标大于最后一个结点的下标。

    二、参考代码

    #include<iostream>
    #include<vector>
    using namespace std;
    int m, n;
    vector<int> v;
    //heap数组在[low, high]的范围进行向下调整
    //其中Low为欲调整结点的数组下标,high一般为堆的最后一个元素的数组下标 
    //int heap[100];
    //int m, n;
    //void downAdjust(int low, int high){
    //	int i = low, j = i * 2;
    //	while(j <= high){
    //		if(j + 1 < high && heap[j + 1] > heap[j]){
    //			j = j + 1;
    //		}
    //		if(heap[j] > heap[i]){
    //			swap(heap[i], heap[j]);
    //			i = j;
    //			j = 2 * i;
    //		}else{
    //			break;
    //		}
    //	}
    //}
    //
    //void createHeap(){
    //	for(int i = n / 2; i >= 1; i--){
    //		downAdjust(i, n);
    //	}
    //}
    //
    //void deleteTop(){
    //	heap[1] = heap[n--];
    //	downAdjust(1, n);
    //}
    //
    ////对heap数组在[low, high]的范围进行向上调整
    ////其中low一般设置为1, high表示欲调整结点的数组下标 
    //void upAdjust(int low, int high){
    //	int i = high, j = i / 2;
    //	while(j <= low){
    //		if(heap[j] < heap[i]){
    //			swap(heap[i], heap[j]);
    //			i = j;
    //			j = i / 2;
    //		}else{
    //			break;
    //		} 
    //	} 
    //}
    //
    //void insert(int x){
    //	heap[++n] = x;
    //	upAdjust(1, n);
    //}
    //
    //void heapSort(){
    //	createHeap();
    //	for(int i = n; i > 1; i--){
    //		swap(heap[i], heap[1]);
    //		downAdjust(1, i - 1);
    //	}
    //}
    void postOrder(int index){
    	if(index >= n) return;
    	postOrder(index*2 + 1);
    	postOrder(index*2 + 2);
    	printf("%d%s", v[index], index == 0 ? "
    " : " ");
    }
    
    int main(){
    	scanf("%d%d", &m, &n);
    	v.resize(n);
    	for(int i = 0; i < m; i++){
    		for(int j = 0; j < n; j++){
    			scanf("%d", &v[j]);
    		}
    		int flag = v[0] > v[1] ? 1 : -1;
    		for(int j = 0; j <= (n-1) / 2; j++){
    			int left = j * 2 + 1, right = j * 2 + 2;
    			if(flag == 1 && (v[left] > v[j] || (right < n && v[right] > v[j]))) flag = 0;
    			if(flag == -1 && (v[left] < v[j] || (right < n && v[right] < v[j]))) flag = 0;
    		}
    		if(flag == 0) printf("Not Heap
    ");
    		else printf("%s Heap
    ", flag == 1 ? "Max" : "Min");
    		postOrder(0);
    	}
    	return 0;
    }
    
  • 相关阅读:
    eclipse
    ORA00904:标识符无效,preparedstatement
    mysql 创建用户
    web 默认servlet
    https tomat
    gzip
    sftp 上传文件
    jquery dwrutil confilit
    xmlbeans读写xml文件
    敏捷开发“松结对编程”实践大型团队篇
  • 原文地址:https://www.cnblogs.com/tsruixi/p/13173815.html
Copyright © 2011-2022 走看看