赞
踩
哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途。哈夫曼树的定义,涉及路径、路径长度、权等概念,下面先给出这些概念的定义,然后再介绍哈夫曼树
例如,下图中所示的3棵二叉树,都含4个叶子结点a、b、c、d,分别带权7、5、2、4,他们的带权路径长度分别为
在构造哈夫曼树时,首先选择权小的,这样保证权大的离根较近,这样一来,在计算树的带权路径长度时,自然会得到最小带权路径长度,这种生成算法是一种典型的贪心法。
注:哈夫曼树的结点的度数为0或2,没有度为1的结点。
//-------哈夫曼树的存储表示-------
typedef struct{
int weight;//结点的权值
int parent,lchild,rchild;//结点的双亲、左孩子、右孩子的下标
}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树
权值 | 双亲 | 左孩子 | 右孩子 |
---|---|---|---|
weight | parent | lchild | rchild |
包含n棵树的森林经过n-1次合并才能形成哈夫曼树,共产生n-1个新结点
【算法步骤】
void CreateHuffmanTree(HuffmanTree &HT,int n) { if(n<=1) return; m=2*n-1; HT=new HTNode[m+1];//0号单元未用,所以需要动态分配m+1个单元,HT[m]表示根结点 for(i=1;i<=m,++1)//将1~m号单元中的双亲、左孩子,右孩子的下标都初始化为0 { HT[i].parnt=0;HT[i].lchild=0;HT[i].rchild=0; } for(i=1;i<=n,++1)//输入前n个单元中叶子结点的权值 cin>>HT[i].weight; /*-----------初始化工作结束,下面开始创建哈夫曼树-----------*/ for(i=n+1;i<=n;++1) {//通过n-1次的选择、删除、合并来创建哈夫曼树 Select(HT,i-1,s1,s2); //在HT[k](1≤k≤i-1)中选择两个其双亲域0且权值最小的结点,并返回它们在HT中的序号s1和s2(最小结点下标) HT[s1].parent=i;HT[s2].parent=i;//修改HT[s1][s2]的parent值 HT[i].lchild=s1;HT[i].rchild=s2;//s1,s2分别作为i的左右孩子 HT[i].weight=HT[s1].weight+HT[s2].weight;//i的权值为左右孩子之和 } }
已知w=(5,29,7,8,14,23,3,11),构造一棵哈夫曼树,计算树的带权路径长度,并给出构造过程中存储结构HT的初始状态和终结状态。
HT初态 | ||||
---|---|---|---|---|
结点i | weight | parent | lchild | rchild |
1 | 5 | 0 | 0 | 0 |
2 | 29 | 0 | 0 | 0 |
3 | 7 | 0 | 0 | 0 |
4 | 8 | 0 | 0 | 0 |
5 | 14 | 0 | 0 | 0 |
6 | 23 | 0 | 0 | 0 |
7 | 3 | 0 | 0 | 0 |
8 | 11 | 0 | 0 | 0 |
9 | - | 0 | 0 | 0 |
10 | - | 0 | 0 | 0 |
11 | - | 0 | 0 | 0 |
12 | - | 0 | 0 | 0 |
13 | - | 0 | 0 | 0 |
14 | - | 0 | 0 | 0 |
15 | - | 0 | 0 | 0 |
HT的终态 | ||||
---|---|---|---|---|
结点i | weight | parent | lchild | rchild |
1 | 5 | 9 | 0 | 0 |
2 | 29 | 14 | 0 | 0 |
3 | 7 | 10 | 0 | 0 |
4 | 8 | 10 | 0 | 0 |
5 | 14 | 12 | 0 | 0 |
6 | 23 | 13 | 0 | 0 |
7 | 3 | 9 | 0 | 0 |
8 | 11 | 11 | 0 | 0 |
9 | 8 | 11 | 7 | 1 |
10 | 15 | 12 | 3 | 4 |
11 | 19 | 13 | 9 | 8 |
12 | 29 | 14 | 5 | 10 |
13 | 42 | 15 | 11 | 6 |
14 | 58 | 15 | 2 | 12 |
15 | 100 | 0 | 13 | 14 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。