一.哈夫曼树链式存储
首先做如下定义:
Typedef struct HuffNode{
Int data;/*权值*/
Struct HuffNode *LChild;
Struct HuffNode *RChild;
}HuffNode,*HuffTree;
我们在构造时,先建议叶子结点,用一组HuffNode型的指针数组(HuffNode * S
)表示:
Void createHuffTree(HuffTree *ht,int a[],int n)
S[i]=(HuffTree)malloc(sizeof(HuffNode));
S[i]->data=a[i];
S[i]->LChild=NULL;s[i]->RChild=NULL;
然后,找到s[i]->data 的两个结点,设为s[x1],s[x2];定义临时结点 HuffNode* temp;temp=(HuffTree)malloc(sizeof(HuffTree));
Temp->data=s[x1]->data+s[x2]->data;
temp->LChild=s[x1];Temp->RChild=s[x2];
s[x1]=temp;//将temp结点加入到数组s中。删除s[x1];
S[x2]=NULL;//删除s[x2];
接着再找最小的,后面过程是重复的,对于n个叶子结点的哈夫曼树,该循环体其实只用执行n-1次。
最后一步,直接赋值:*ht=temp;
其实上面过程中的指针 temp,完全可以用*ht代替,那样的话,最后一步就赘余了。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define M 20
#define INF 100
typedef struct HuffNode{
int data;
struct HuffNode *LChild;
struct HuffNode *RChild;
}HuffNode,*HuffTree;
void CreateHuffTree(HuffTree *ht){
int min1,min2,mid;
HuffNode *s
,*temp;
int i,n,m;
for(i=0;i<M;i++) s
=NULL;/*初始化。。*/
printf("请输入叶子结点的个数\n");
scanf("%d",&n);
printf("请输入权值\n");
for(i=0;i<n;i++){
s[i]=(HuffNode *)malloc(sizeof(HuffNode));
scanf("%d",&(s[i]->data));
s[i]->LChild=NULL;
s[i]->RChild=NULL;
}/*创建叶子结点*/
m=n-1;
do{
m--;
mid=INF;
for(i=0;i<n;i++)
if((s[i]!=NULL)&&(mid>s[i]->data)) {mid=s[i]->data;min1=i;}
mid=INF;
for(i=0;i<n;i++)
if((s[i]!=NULL)&&(i!=min1)&&(mid>s[i]->data)) {mid=s[i]->data;min2=i;}/*找最小的2个结点*/
temp=(HuffTree)malloc(sizeof(HuffNode));
temp->data=s[min1]->data+s[min2]->data;
temp->LChild=s[min1];
temp->RChild=s[min2];