定义
带权路径长度(weighted path length wpl):
n个叶子结点,每个叶子结点都带有权值wi,
从根结点到叶子结点的长度为li,从根结点到所有叶子结点的带权路径之和:Σwi*li
最优二叉树或哈夫曼树:
wpl最小的二叉树
构造
会用到堆的数据结构
#inluce"HNode.h"
struct HTNode{
int weight;
HuffmanTree left,right;
}
typedef struct HTNode *HuffmanTree;
HuffmanTree Huffman(MinHeap h){
//最小堆储存的元素类型为HuffmanTree
int i,n;
HuffmanTree t;
BulidHeap(h);//创建最小堆
n=h->Size;
for(i=1;i<n;i++){//做h->Size-1合并
t=(HuffmanTree)malloc(sizeof(struct HTNode));
t->left=DeleteMin(h);//每次都是删除堆的根结点,返回值是最小堆的根结点大小
t->right=DeleteMin(h);
t->weight=t->left->weight + t->right->weight;
Insert(h,t);//将新t插入最小堆
}
return DeleteMin(h);//经过n-1次合并,此时堆数组中只剩一个元素,即哈夫曼树的根结点
}