1. 程式人生 > >中國大學MOOC-陳越、何欽銘-資料結構-2018秋——堆中的路徑

中國大學MOOC-陳越、何欽銘-資料結構-2018秋——堆中的路徑

我的中國大學MOOC-陳越、何欽銘-資料結構-2018秋程式碼倉:https://github.com/617076674/MOOC-DataStructure-2018-Autumn

題目描述:

知識點:堆

思路:新建堆

注意,必須根據題意來,將新元素加入堆尾,上浮調整。如果對整個陣列採用下沉調整策略,會出錯。

建堆的時間複雜度是O(logN)。空間複雜度是O(N)。

C++程式碼:

#include<iostream>
#include<vector>

using namespace std;

int N, M, heap[1000], index = 0; 

void insert(int num);
void upAdjust(int low, int high);
void printFather(int num);

int main(){
	scanf("%d %d", &N, &M);
	int num;
	for(int i = 0; i < N; i++){
		scanf("%d", &num);
		insert(num);
	}
	for(int i = 0; i < M; i++){
		scanf("%d", &num);
		printFather(num - 1);
	}
	return 0;
}

void insert(int num){
	heap[index] = num;
	upAdjust(0, index);
	index++; 
}

void upAdjust(int low, int high){
	int i = high, j = (high - 1) / 2;
	while(j >= low){
		if(heap[j] > heap[i]){
			swap(heap[i], heap[j]);
			i = j;
			j = (i - 1) / 2;
		}else{
			break;
		}
	}
}

void printFather(int num){
	vector<int> fathers;
	while(num >= 0){
		fathers.push_back(heap[num]);
		if(num == 0){
			break;
		}
		num = (num - 1) / 2;
	}
	for(int i = 0; i < fathers.size(); i++){
		printf("%d", fathers[i]);
		if(i != fathers.size() - 1){
			printf(" ");
		}else{
			printf("\n");
		}
	}
}

C++解題報告: