#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#define Max 100
//哈夫曼树 节点
typedef struct HuffmanNode{
int weigth;//权值
struct HuffmanNode* lchild;//左子树
struct HuffmanNode* rchild;//右子树
}Huff,*pHuff;
typedef struct MinHeap{
pHuff Node;
int size;
int max;
}MinHeap,*pMinHeap;
//初始化最小堆
pMinHeap init(int* arr,int len){
pMinHeap H=(pMinHeap)malloc(sizeof(MinHeap));
H->Node=(pHuff)malloc(sizeof(Huff)*len);
H->size=len;
H->max=Max;
for(int i=1;i<=len;i++){
H->Node[i].weigth=arr[i];
H->Node[i].lchild=NULL;
H->Node[i].rchild=NULL;
}
return H;
}
//创建最小堆
void creat(pMinHeap H){
for(int i=H->size/2;i>=1;i--){
int parent=i;
int child=i*2;
while(child<H->size){
if(child!=H->size&&H->Node[child+1].weigth<H->Node[child].weigth)
child++;
if(H->Node[child].weigth<H->Node[parent].weigth){
Huff hu=H->Node[child];
H->Node[child]=H->Node[parent];
H->Node[parent]=hu;
parent=child;
child=parent*2;
}
else{
break;
}
}
}
}
bool IsFull(pMinHeap H){
if(H->size==Max){
return true;
}
return false;
}
bool IsEmpty(pMinHeap H){
if(H->size==0){
return true;
}
return false;
}
//插入
void Insert(pMinHeap H,pHuff Hu){
if(IsFull(H)){
printf("堆满");
return ;
}
int i=H->size+1;
H->size=H->size+1;
for( ;H->Node[i/2].weigth>Hu->weigth;i=i/2){
H->Node[i]=H->Node[i/2];
}
H->Node[i]=(*Hu);
}
//删除
Huff Delete(pMinHeap H){
int parent,child;
Huff Min=H->Node[1];
Huff hu=H->Node[H->size];
H->size--;
parent=1;
child=parent*2;
while(parent*2<=H->size){
if(child!=H->size&&H->Node[child+1].weigth<H->Node[child].weigth)
child++;
if(H->Node[child].weigth<hu.weigth){
H->Node[parent]= H->Node[child];
parent=child;
child=parent*2;
}
else{
break;
}
}
H->Node[parent]=hu;
return Min;
}
//先序遍历
void tra(pHuff T){
if(T!=NULL){
printf("%d ",T->weigth);
if(T->lchild!=NULL)
tra(T->lchild);
if(T->rchild!=NULL)
tra(T->rchild);
}
}
void tra1(pMinHeap H){
for(int i=1;i<=H->size;i++){
printf("%d ",H->Node[i].weigth);
}
}
int main()
{ int arr[]={0,10,7,5,2,4};
int len=sizeof(arr)/sizeof(int)-1;
printf("111111111111111\n");
pMinHeap H=init(arr,len);
printf("2222222222222222\n");
creat(H);
//printf("33333333333333333333\n");
tra1(H);
//printf("4444444444444444\n");
pHuff T;
Huff HU;
//printf("55555555555555555\n");
//创建树
for(int i=1;i<H->size;i++){
printf("%d\n",i);
T=(pHuff)malloc(sizeof(Huff));
HU=Delete(H);
T->lchild=&HU;
HU=Delete(H);
T->lchild=&HU;
T->weigth=T->lchild->weigth+T->rchild->weigth;
Insert(H,T);
}
HU=Delete(H);
T=&HU;
printf("66666666666666666\n");
tra(T);
return 0;
}
```c
//创建树
for(int i=1;i<H->size;i++){
printf("%d\n",i);
T=(pHuff)malloc(sizeof(Huff));
HU=Delete(H);
T->lchild=&HU;
HU=Delete(H);
T->lchild=&HU;
T->weigth=T->lchild->weigth+T->rchild->weigth;
Insert(H,T);
}
HU=Delete(H);
T=&HU;
printf("66666666666666666\n");
tra(T);
```