学过了哈夫曼编码知识点,邱同学就给我发来了相关程序,看起来还不错。
贴出来代码,以飨大家。
要点:
1、二叉树用伪指针表示法;
2、哈夫曼编码采用自下而上回溯的办法。
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
typedef char **HuffmanCode;
//结点类型
typedef struct
{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
//从若干棵树中选择出根的weigth最小的两个
void Select(HuffmanTree &HT, int n, int &s1, int &s2) //构造哈夫曼树中的select函数
{
int minum;
for(int i=1; i<=n; i++)
{
if(HT[i].parent == 0)
{
minum = i;
break;
}
}
for(int i=1; i<=n; i++)
{
if(HT[i].parent == 0)
if(HT[i].weight < HT[minum].weight)
minum = i;
}
s1 = minum;
for(int i=1; i<=n; i++)
{
if(HT[i].parent == 0 && i != s1)
{
minum = i;
break;
}
}
for(int i=1; i<=n; i++)
{
if(HT[i].parent == 0 && i != s1)
if(HT[i].weight < HT[minum].weight)
minum = i;
}
s2 = minum;
}
//哈夫曼树构造函数
void CreatHuffmanTree(HuffmanTree &HT,int n) //构造哈夫曼树
{
int i,m, s1, s2;
if(n<=1)
return;
m=2*n-1;
HT=new HTNode[m+1];
for(int i=1;i<=m;i++)
{
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=1;i<=n;i++)
{
cout<<"plz input the "<<i<<"th node of value:";
cin>>HT[i].weight;
}
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;
cout<<HT[i].weight<<"("<<HT[s1].weight<<","<<HT[s2].weight<<")"<<endl;
}
cout<<endl;
}
//哈夫曼编码函数
void HuffmanTreeCode(HuffmanTree HT,HuffmanCode &HC,int n) //求哈夫曼编码
{
int i,start,c,f;
HC=new char*[n+1];
char *cd=new char[n];
cd[n-1]='\0';
for(i=1;i<=n;i++)
{
start =n-1;
c=i;
f=HT[i].parent;
while(f!=0)
{
start--;
if(HT[f].lchild==c)
//cd[start]='\0';//你的
cd[start]='0';//我的
else
cd[start]='1';
c=f;
f=HT[f].parent;
}
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
cout<<"第"<<i<<"个数据的哈夫曼编码为:"<<HC[i]<<endl;
}
delete cd;
}
//打印哈夫曼树
void printTree(HuffmanTree HT,int n)
{//zzt
int i;
for(i=1;i<=2*n-1;i++)
{
cout<<HT[i].weight<<" "<<HT[i].parent<<" "<<HT[i].lchild<<" "<<HT[i].rchild<<endl;
}
}
//主函数
int main()
{
int i,n;
HuffmanTree HT;
HuffmanCode HC;
cout<<"plz input the number of node"<<endl;
cin>>n;
CreatHuffmanTree(HT,n);
//zzt
printTree(HT,n);
HuffmanTreeCode(HT,HC,n);
return 0;
}