A1147 Heaps (30分)
一、技术总结
- 这一题是关于堆排序的问题。
- 先理解啥是堆,也就是一棵完全二叉树,但是还有附加要求,如果满足每个结点的左右子树的结点值都小于自己称为大顶堆;如果是每个结点的左右子树值都大于自己,称为小顶堆。
- 所以解决该问题可以应用完全二叉树的一些知识点。
- 这一题是给出每棵树的层序遍历,这是满足结点下标是刚刚按照顺序从小到大,需要我们判断每课树是否为堆,同时输出每课树的后序遍历。
- 我们首先应该判断该树是否为堆,因为具有完全二叉树的特质,我们只需要遍历[0, (n-1)/2)]下标,判断左右子树跟自己的关系即可,因为其他的是叶子结点,无需判断;
- 最后就是后序遍历函数的编写,利用递归的思想,递归边界为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 ? "\n" : " ");
}
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\n");
else printf("%s Heap\n", flag == 1 ? "Max" : "Min");
postOrder(0);
}
return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.