1.带权最短路径wpl
2.哈夫曼树是wpl最小的树,但树不一定唯一。左右子树交换,大于二的同权重的树的任意组合都会影响其唯一性。
3.n个叶子节点的总节点数为2n-1。
4.哈夫曼树的建立,每次将两个权重最小的树组合一个大树(小树消失,大树插入。这里的存在与否依据parent标记),直到还有一棵树为止。
5.4可知哈夫曼树没有度为1的结点,又**n**0=**n**2+1。所以可得结论3.
6.若数据量很大,可以通过最小堆来实现两个最小权重树的查找。
7.哈夫曼编码,对已建立的哈夫曼树编码,左边(verge)为0,右边为1,穿起来即可。
#define status int
#define ok 1
#define error 0
#define MAXVALUE 10000
typedef struct{
int weight;
int parent,lchild,rchild;
}HuTNode,*HuffmanTP;
typedef char** HuffmanTreeCode;
status HuffmanCode(HuffmanTP &HT,HuffmanTreeCode &HC,int * w ,int n){
if(n<=1) return ok;
int m,i,j,min,tmpweight,top,c,f; HuffmanTP p;
m=2*n-1;
HT=(HuffmanTP)malloc(sizeof(HuTNode)*(m+1)); //0号位作哨兵
if(!HT) return error;
for(i=1,p=HT;i<=n;i++){ //叶子节点初始化
(p+i)->weight=*(w+i);
(p+i)->parent=0;
(p+i)->lchild=0;
(p+i)->rchild=0;
}
HT->parent=0;
HT->weight=MAXVALUE;
for(;i<=m;i++){ //非叶子节点初始化
(p+i)->weight=MAXVALUE;
(p+i)->parent=0;
(p+i)->lchild=0;
(p+i)->rchild=0;
}
for(i=n+1;i<=m;i++){ //建立哈夫曼树
min=0;
for(j=1;j<=m;j++){
if((HT+j)->parent==0 && (HT+min)->weight>(HT+j)->weight)
min=j;
}
tmpweight=(HT+min)->weight;
(HT+min)->parent=i;
(HT+i)->lchild=min;
min=0;
for(j=1;j<=m;j++){
if((HT+j)->parent==0 && (HT+min)->weight>(HT+j)->weight)
min=j;
}
(HT+min)->parent=i;
(HT+i)->rchild=min;
(HT+i)->weight=(HT+min)->weight+tmpweight;
}
//利用已编辑好的哈夫曼树进行哈夫曼编码
HC=(char**)malloc(sizeof(char*)*(n+1));
char * cd;
cd=(char*)malloc(sizeof(char)*n); //n个叶结点,最多编码n-1,还有一位留给'\0'
// strcpy(cd+n-1,"\0"); // strcpy(s1,s2);中s1和s2都是字符数组的首地址,所以这里也该放地址,不是strcpy(cd[n-1],"\0");
for(i=1;i<=n;i++){
top=0;
for(c=i,f=(HT+i)->parent;f!=0;c=f,f=(HT+f)->parent){
if((HT+f)->lchild==c){
strcpy(cd+top++,"0");
} else{
strcpy(cd+top++,"1");
}
}
HC[i]=(char*)malloc(sizeof(char)*(top+2));
strcpy(HC[i],cd);
}
free(cd);
return ok;
}
status main(void){
int i;
HuffmanTP head;
HuffmanTreeCode codes;
int ws[]={MAXVALUE,12,13,15,4,10,1,3};
int n=7;
HuffmanCode(head,codes,ws,n);
for(i=1;i<=7;i++)
printf("%s\n",codes[i]);
return ok;
}