哈夫曼树
Posted 梦西空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈夫曼树相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
using namespace std;//哈夫曼树及其编码
const int MAX=10;
const int MAXF=10000;
//哈夫曼树
typedef struct
int weight;
int lchild,rchild,parent;
HFMtree;
//哈夫曼编码
typedef struct
int weight;
int data[MAX];
int start;//start为哈夫曼编码初始位置
HFMcode;
//构建哈夫曼树a,用b储存哈夫曼编码,c为权值,n为结点数
void HFMansf(HFMtree *(*a),HFMcode *(*b),int *c,int n)
if(n<=1)
return;
int m=2*n-1;//结点总数
int xb1,xb2;
int i,j;
*a=new HFMtree [m];
for(i=0;i<n;i++)
(*a)[i].weight=c[i];
(*a)[i].lchild=(*a)[i].rchild=(*a)[i].parent=-1;
//初始化叶子结点
for(i=n;i<m;i++)
(*a)[i].lchild=(*a)[i].rchild=(*a)[i].parent=-1;
int min1,min2;
for(i=n;i<m;i++)
min1=min2=MAXF;
for(j=0;j<i;j++)//找到两个权值最小的结点
if((*a+j)->parent==-1&&(*a+j)->weight<min1)
min2=min1;xb2=xb1;min1=(*a+j)->weight;
xb1=j;
else if((*a+j)->parent==-1&&(*a+j)->weight<min2)
min2=(*a+j)->weight;xb2=j;
(*a+xb1)->parent=(*a+xb2)->parent=i;
(*a+i)->weight=min1+min2;
(*a+i)->lchild=xb1;(*a+i)->rchild=xb2;
*b=new HFMcode [n];
int start;
int f,d;
for(i=0;i<n;i++)
f=(*a+i)->parent;
(*b+i)->weight=c[i];
d=i;
start=n;
while(f!=-1)
if((*a+f)->lchild==d)
(*b+i)->data[--start]=0;
else
(*b+i)->data[--start]=1;
d=f;f=(*a+d)->parent;
(*b+i)->start=start;
int main()
HFMcode *b;HFMtree *a;int n=6;
int c[]=7,8,4,3,2,6;
HFMansf(&a,&b,c,n);
int i,j;
for(i=0;i<n;i++)
cout<<"权值:"<<(b+i)->weight<<'\\n'<<"编码:";
for(j=(b+i)->start;j<n;j++)
cout<<(b+i)->data[j];
cout<<endl;
以上是关于哈夫曼树的主要内容,如果未能解决你的问题,请参考以下文章