目录
10.6 哈夫曼(Huffman)树
(1) 建立哈夫曼树
1. 哈夫曼树(最优二叉树):带权路径长度最小的二叉树。
树的路径长度:一棵树的每一个叶结点到根结点的路径长度的和。
带权二叉树:给树的叶结点赋上某个实数值(称叶结点的权)。
带权路径长度:各叶结点的路径长度与其权值的积的总和。
2. 如何构建哈夫树:贪心策略——权越大离根越近。
① 首先,创建 n 个初始的 Huffman 树,每棵树只包含单一的叶结点,叶结点记录对应字母。
② 接着拿走权最小但没有被处理的两棵树,再把它们标记为 Huffman 树的叶结点。
③ 把这两个叶结点标记为一个分支结点的两个子结点,而这个结点的权即为两个叶结点的权之和。
④ 重复上述步骤,直到序列中只剩下一个元素。
int n;
struct node
{
int w;
int parent, leftchild, rightchild;
} h[M];
node * buildtree(int *weight) // weight[i]表示结点i的权值。返回值是Huffman的树根。
{
int p1, p2;
int min1, min2;
memset(h,-1,sizeof(h));
for (int i=0; i<n; i++) h[i].w=weight[i];
int m=2*n-1;
for (int i=n; i<m; i++)
{
min1=min2=INF;
for (int j=0; j<i; j++)
if (h[j].parent==-1)
{
if (h[j].w < min1)
min2=min1, min1=h[j].w, p2=p1, p1=j;
else if (h[j].w < min2)
min2=h[j].w, p2=j;
}
h[p1].parent=i;
h[p2].par

最低0.47元/天 解锁文章
1121





