树的双亲表示法
#define MAX_TREE_SIZE 100
typedef struct PTNode{
TElemType data;
int parent;
}PTNode;
typedef struct {
PTNode nodes[MAX_TREE_SIZE];
int r,n;
} Ptree;
孩子表示法
typedef struct CTNode{
int child;
struct CTNode *next;
} *ChildPtr;
typedef struct {
TElemType data;
ChildPtr firstchild;
}CTBox;
typedef struct {
CTBox nodes[MAX_TREE_SIZE];
int r,n;
} CTree;
孩子兄弟表示法:即转化为二叉树的方式
typedef struct CSNode{
TElemType data;
struct CSNode *firstchild, *nextsibling;
}CSNode, CSTree;
哈夫曼树的表示
typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char ** HuffmanCode;
构造哈夫曼树,并编码
void HuffmanCoding(HuffmanTree &HT,HuffmanCode& HC,int *w,int n){
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT?, i=1;i<=n; i++, p++, ++w) *p={ *w,0,0,0 };
for( ; i<=m; ++i, ++p) *p={ 0,0,0,0 };
for(i=n+1;i<=m;i++){
Select[HT,i-1,s1,s2];
HT[s1].parent=i; HT[s2].parent=i;
HT[i].lchild=s1; HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));?
cd=(char*)malloc(n*sizeof(char));
cd[n-1]=‘\0’;
for(i=1;i<=n;i++){
?
}
for(i=1;i<=n;i++){
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c) cd[--start]=‘0’;
else cd[--start]=‘1’;
HC[i]=(char*)malloc(sizeof(char));
strcpy(HC[i],&cd[start]);
free(cd);
}
总的哈夫曼树
#include <iostream>
#include<cstring>
#define INT 10000
#define Max 200
using namespace std;
typedef char**HuffmanCode;
char ch[200];
int w[200];
typedef struct{
int weight;
int lchild,rchild,parent;
}HTNode,*HuffmanTree;
int Select(HuffmanTree &HT,int n,int &s1,int &s2){
int min1,min2;
min1=min2=INT;
for(int i=1;i<=n;i++){
if(HT[i].parent==0){
if(HT[i].weight<min1){
min2 = min1;
min1 = HT[i].weight;
s2 = s1;
s1 = i;
}else if(HT[i].weight<min2){
min2 = HT[i].weight;
s2 = i;
}
}
}
return 1;
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){
if(n<=1)
return;
int m=2*n-1;
HT=(HuffmanTree)malloc(sizeof(HTNode)*m+1);
for(int i=1;i<=m;i++){
HT[i].lchild=0;
HT[i].parent=0;
HT[i].rchild=0;
HT[i].weight=0;
}
cout<<"初始化完成。。。"<<endl;
for(int i=1;i<=n;i++){
HT[i].weight=w[i];
}
int s1=0;
int s2=0;
for(int i=n+1; i<=m; i++)
{
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc(sizeof(char*)*(n+1));
char *cd=(char *)malloc(sizeof(char)*n);
cd[n-1]='/0';
for(int i=1;i<=n;i++){
int start=n-1;
for(int c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){
if(HT[f].lchild==c){
cd[--start]='0';
}else{
cd[--start]='1';
}
}
HC[i]=(char*)malloc(sizeof(char)*(n-start));
strcpy(HC[i],&cd[start]);
cout<<ch[i]<<"的编码"<<HC[i]<<endl;;
}
free(cd);
cout<<"编码完成。。。"<<endl;
}
void Decoding(HuffmanTree HT,int n)
{
int j,len,m;
string str;
m=2*n-1;
cout<<"请输入要译码的:"<<endl;
cin>>str;
len=str.size();
int i=0;j=m;
while(i<len)
{
if(str[i]=='0'){
j=HT[j].lchild;}
else {j=HT[j].rchild;}
if(HT[j].lchild==0)
{
cout<<"译码结果为:"<<ch[j];
j=m; }
i++;
}
cout<<endl;
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
int n;
cout<<"请输入字符的个数n:"<<endl;
cin>>n;
for(int i=1;i<=n;i++){
cout<<"请输入第"<<i<<"个字符"<<endl;
cin>>ch[i];
}
for(int i=1;i<=n;i++){
cout<<"请输入第"<<i<<"个的权重"<<endl;
cin>>w[i];
}
HuffmanCoding(HT,HC,w,n);
cout<<"编码结束"<<endl;
Decoding(HT,n);
return 0;
}