A1147 Heaps (30分)

一、技术总结

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

二、参考代码

#include
#include
using namespace std;
int m, n;
vector 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;
}

你可能感兴趣的:(A1147 Heaps (30分))