树的应用——最大堆的建立

来源:互联网 发布:c语言播放音乐linux 编辑:程序博客网 时间:2024/06/03 16:56
#include<stdio.h>
#include<stdlib.h>
typedef struct HNode *Heap;//堆的定义类型 
struct HNode{
int* Data;//存储元素的数组
int Size;//堆中当前元素的个数 
int Capacity;//堆的最大容量 
};
typedef Heap MaxHeap;
void Print(MaxHeap H);
void PercDown(MaxHeap H,int p)
{
//下滤,将H中H->Data[p]为根的子堆调整为最大堆
int Parent,Child;
int X;

X=H->Data[p];//取出根节点存放的值
for(Parent=p;Parent*2<=H->Size;Parent=Child){
Child=Parent*2;
if(Child!=H->Size &&(H->Data[Child]<H->Data[Child+1])){
Child++;//Child指向左右节点中较大者 
}
if(X>H->Data[Child])break;//找到了合适的位置 
else //下滤
H->Data[Parent]=H->Data[Child]; 
}
H->Data[Parent]=X;
 }
void BuildHeap(MaxHeap H)
{
//调整H->Data[]中的元素,使其满足最大堆的有序性
//这里假设所有的H->Size的元素都已经存在H->Data[]中
int i;
//从最后一个节点的父节点开始,到根节点1
for(i=H->Size/2;i>0;i--){
PercDown(H,i);
Print(H);
printf("\n");

}
void Print(MaxHeap H)
{
int i;
for(i=1;i<H->Size+1 ;i++){
printf("%d ",H->Data[i]);
}
}
int main()
{
freopen("C:\\Users\\DELL\\Desktop\\新建文件夹 (2)\\text.txt","r",stdin);
MaxHeap Head;
Head=(MaxHeap)malloc(sizeof(struct HNode));
scanf("%d",&Head->Size);
Head->Data=(int*)malloc((Head->Size+10)*sizeof(int));
int i;
for(i=1;i<Head->Size+1;i++){
scanf("%d",&Head->Data[i]);
}
Print(Head);
printf("\n");
BuildHeap(Head);
Print(Head);
return 0;
}
 
0 0