哈夫曼树的构建—数据结构算法

部分源码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 8 
typedef struct{
char data;
int weight;
int parent,lchlid,rchlid;
}HTNode,*HuffmanTree;


int InitHTNode(HuffmanTree &HT,char da[],int w[]);
int CreateTree(HuffmanTree &HT);
int Select(HuffmanTree &HT,int& index,int cout);
int CodeTree(HuffmanTree &HT,char code[][M]);
int DeCodeTree(HuffmanTree &HT,char decode[]);

 

int InitHTNode(HuffmanTree &HT,char da[],int w[]){
int l=strlen(da);
int m=2*l;
HT=new HTNode[m];
for(int i=1;i<m;i++){
if(i<=l){
HT[i].data=da[i-1];
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchlid=0;
HT[i].rchlid=0;
}else{
HT[i].data=' ';
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchlid=0;
HT[i].rchlid=0;
}
}
}

int CreateTree(HuffmanTree &HT){
int index;
int cout;
for(int i=M+1;i<2*M;i++){
cout=i;
Select(HT,index,cout);//left
HT[i].lchlid=index;
HT[index].parent=i;
HT[i].weight+=HT[index].weight;
Select(HT,index,cout);//right
HT[i].rchlid=index;
HT[index].parent=i;
HT[i].weight+=HT[index].weight;
}
}

int Select(HuffmanTree &HT,int& index,int cout){
int w=100;
for(int i=1;i<cout;i++){
if(HT[i].parent==0 && HT[i].weight!=0){
if(HT[i].weight<w){
index=i;
w=HT[i].weight;
}
}
}
}

int CodeTree(HuffmanTree &HT,char code[][M]){
int p,c;
for(int i=1;i<=M;i++){
p=HT[i].parent;
c=i;
int cout=0;
while(p!=0){
if(HT[p].lchlid==c){
code[i-1][cout]='0';
}
if(HT[p].rchlid==c){
code[i-1][cout]='1';
}
c=p;
p=HT[p].parent;
cout++;
}

}
}

int DeCodeTree(HuffmanTree &HT,char decode[]){
int l=strlen(decode);
int index=2*M-1;
for(int i=0;i<l;i++){
if(decode[i]=='0'){
index=HT[index].lchlid;
if(HT[index].lchlid==0&&HT[index].rchlid==0){
printf("%c",HT[index].data);
index=2*M-1;
}
}
else{
index=HT[index].rchlid;
if(HT[index].lchlid==0&&HT[index].rchlid==0){
printf("%c",HT[index].data);
index=2*M-1;
}
}
}
};

  

注意这里仅为部分代码。没有main主函数 获取源码请关注“值南针”微信公众号:可用电脑微信关注或手机关注(要最新版微信pc端)。在电脑方便。直接下载源码。

 

 

 

点击想要的算法

点击下载直接就可以用的。

posted @ 2020-01-19 19:25  值南针  阅读(599)  评论(0编辑  收藏  举报