建立小顶堆,并打印出指定节点到根的路径。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Yonggie/article/details/89401210

关于详细的堆方法,请参考:

方法一,可以用快速建堆的方法,先让每个元素都待在原来位置,然后从surSize/2处向前getDown()。


#include <iostream>
#include <cstdio> 
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>
#include <queue>
#include <cmath>
using namespace std;

const int maxn=1e3+100;
int curSize=0;
int HeapTree[maxn];

void getDown(int index){
	int temp=HeapTree[index];
	
	while(index*2<=curSize){
		int child=index*2;
		if(child!=curSize&&HeapTree[child]>HeapTree[child+1])child++;
		if(temp<=HeapTree[child]) break;
		else HeapTree[index]=HeapTree[child];
		index=child;
	}
	
	HeapTree[index]=temp;
	return;
}
void ShowPath(int index){
	while(index/2>=1){
		cout<<HeapTree[index]<<" ";
		index/=2;
	}
	cout<<HeapTree[index]<<endl;
	return;
}
int main(){
	int question=0;
	while(cin>>curSize>>question){
		memset(HeapTree,0,sizeof(0));
		HeapTree[0]=-0x3f3f3f3f;
		for(int i=1;i<=curSize;i++) cin>>HeapTree[i];
		
		for(int i=curSize/2;i>=1;i--)
			getDown(i);
		
		for(int i=1;i<=curSize;i++) cout<<HeapTree[i]<<" ";
		cout<<endl;
		int t=1;
		for(int i=0;i<question;i++){
			cin>>t;
			ShowPath(t);
		}
	}
}

方法二:

用堆的本身操作,每次输入一个值,就insert进去。

#include <iostream>
#include <cstdio> 
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>
#include <queue>
#include <cmath>
using namespace std;

const int maxn=1e3+100;
int curSize=0;
int HeapTree[maxn];
//原来不是用快速建堆的那个方法…… 
void getDown(int index){
	int temp=HeapTree[index];
	
	while(index*2<=curSize){
		int child=index*2;
		if(child!=curSize&&HeapTree[child]>HeapTree[child+1])child++;
		if(temp<=HeapTree[child]) break;
		else HeapTree[index]=HeapTree[child];
		index=child;
	}
	
	HeapTree[index]=temp;
	return;
}

void Insert(int value){
	int i=curSize+1;
	for(;HeapTree[i/2]>value;i/=2)
		HeapTree[i]=HeapTree[i/2];
	HeapTree[i]=value;
	curSize++;
	return;
}

void ShowPath(int index){
	while(index/2>=1){
		cout<<HeapTree[index]<<" ";
		index/=2;
	}
	cout<<HeapTree[index]<<endl;
	return;
}
int main(){
	int question=0;
	int nums=0;
	while(cin>>nums>>question){
		memset(HeapTree,0,sizeof(0));
		HeapTree[0]=-0x3f3f3f3f;
		int t=0;
		for(int i=1;i<=nums;i++){
			 cin>>t;
			 Insert(t);
		}

		for(int i=0;i<question;i++){
			cin>>t;
			ShowPath(t);
		}
		
	}
}

猜你喜欢

转载自blog.csdn.net/Yonggie/article/details/89401210