哈夫曼树中的名词意思:(ps:本想画个图的不知这上面怎么弄,就没弄了)
树的权值:每个树节点所在的那个数字。
树的权值:每个树节点所在的那个数字。
路径:两个节点之间所经过的分支。
路径长度: 某一路径上的分支条数。
节点带权路径长度: 节点的权值*该节点的路径长度。
树带权路径长度:所有叶子节点的带全路径长度之和。树带权路径长度:所有叶子节点的带全路径长度之和。
建立哈夫曼树:单独将数组中的每个值作为一个节点,依次选出剩余节点的最小与次小,并将其合为树结构的一部分。代码为:
btreenode *CreateHuffman(int a[],int n)
{
int i;
btreenode *s[n+1], *ss;
for(int i = 0;i<n;i++){
s[i] = new btreenode; //初始化s指针数组,使每个指针元素指向a数组中对应的元素结点
s[i]->data = a[i]; //将树拆成森林,每棵树都只有一个根节点
s[i]->left = s[i]->right = NULL;
}
for(int i = 1;i<n;i++){ //进行 n-1次循环建立哈夫曼树
int k = -1,t; //k表示森林中具有最小权值的树根结点的下标,t为次最小的下标
for(int j = 0;j<n;j++){ //k初始指向森林中第一棵树,t指向第二棵
if(s[j]&&k==-1){
k = j;
continue;
}
if(s[j]){
t = j;
break;
}
}
for(int i = t;i<n;i++){ //从当前森林中求出最小权值树和次最小 ;
if(s[i]){
if(s[i]->data<s[k]->data){ //比最小树小
t = k;
k = i;
}
else if(s[i]->data<s[t]->data){ //比次小树小