哈夫曼树(Huffman Tree),即最优二叉树(optimium binary tree),是一类带权路径长度最短的二叉树。
1、哈夫曼树的构造方法
1)根据n个权值w1,w2,w3......wn构造n棵二叉树的森林F={T1,T2,T3......Tn}Ti含带权为wi的根节点,无左右子树;
2)在森林F中选择两可根节点权值最小的二叉树作为左右子树,合并为新的二叉树,并删除这两棵二叉树;
3)重复2)步,直到只剩一颗二叉树,即为哈夫曼树
2、哈夫曼树的应用
1)改善判定树。利用哈夫曼树得到最优判定算法。
2)哈夫曼编码
3、哈夫曼树编码算法
类声明:
const int N=30;//叶节点的最大数
const int M=2*N-1;//总结点的最大数
const int MAX=9999;//最大常量
const int L=20;//编码最大长度
struct element
{
int weight;
int lchild,rchild,parent;
};//结构类型说明
typedef struct
{
char bits[N];//用于存放位串
int start;//用于存放编码在位串中的起始位置
char ch;//编码存储的结构类型说明
}codetype;
1)建立哈夫曼树的算法
void HuffmanTree(elemrnt hT[],int w[],int n)
{
int i,k,,i1,i2;
for(i=0;i<2*n-1;i++) hT[i].parent=hT[i].lchild=hT[i].rchild=-1;
for(i=0;i<n;i++) hT[i].weight=w[i];
for(k=n;k<2*n-1;k++){
Select(hT,i1,i2,k);
hT[i1].parent=hT[i2].parent=k;
hT[k].weight=hT[i1].weight+hT[i2].weight;
hT[k].lchild=i1;
hT[k].rchild=i2;
}
}
选取最小两棵二叉树的函数Select():
void Select(element hT[],int &i1,int &i2,int k)
{
int min1=MAX,min2=MAX;//MAX为较大常数,如9999
i1=0;i2=0;//分别记录最小和次小所在的下标值
for(int i=0;i<k;i++)//找出min1<=min2 两个最小
if(hT[i].parent==-1)//一定在双亲为空的结点中找
if(hT[i].weight<min1){
min2=min1;i2=i1;min1=hT[i].weight;i1=i;
}else if(hT[i].weight<min2){
min2=hT[i].weight;i2=i;
}
}
2)建立哈夫曼编码的算法:
void HuffmanCode(element hT[],codetype code[],int n)
{
int i,c,;codetype cd;
for(i=0;i<n;i++){
cd.start=n;c=i;p=hT[[c].parent;//i的双亲p
while(p!=-1){
cd.start--;
if(hT[p].lchild==c)
cd.bits[cd.start]='0';
else
cd.bits[cd.start]='1';
c=p;
p=hT[c].parent;
}
code[i]=cd;
}
}