一、哈夫曼树的相关的几个名词
1、路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。如下图根结点到a结点之间的通路就是一条路径。
2、路径长度:在一条路径中,每经过一个结点,路径长度都要加1。如下图根结点到b结点之间所经过的通路数为2,也就是路径长度为2。
3、结点的权:每一个结点都有一个唯一的数值,称为结点的权。如下图结点a的权值为7,b的权值为5。
4、结点的带权路径长度:根结点到结点间的路径长度*结点的权值。如图1结点b的带权路径长度=2*5=10。
5、树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。如图1的WPL=1*7+2*5+3*2+3*4=35。
二、什么是哈夫曼树?
在权为w1,w2,...,wn的n各叶子结点的所有二叉树中,树的带权路径长度WPL最小的二叉树称为最优二叉树,也叫赫夫曼树或哈夫曼树。
//哈夫曼树的结点结构
typedef struct {
char ch;///字符结点
int weight;///字符权值
int parent;///父母结点
int lchild;///左孩子在数组位置的下标
int rchild;///右孩子在数组位置的下标
}hnode;
三、如何构建哈夫曼树?
在构建哈夫曼树时,只需遵循一个原则:权值越大的结点离根结点越近。(权值最大就作为根结点)
1、构建哈夫曼树的过程:
(1)在n个结点权值中选出最小和次最小的结点权值,两结点组成一个新的二叉树,其根结点的权值为左右孩子结点的权值和。
(2)在原有的n个结点权值中删除最小和次最小·,将新权值加入到n-2个权值的行列中。
(3)重复(1)、(2),直到所有结点构成一棵二叉树为止,这棵树就是哈夫曼树。
2、构建哈夫曼树:
哈夫曼树表:
结点i | 字符 | 权值 | 左孩子 | 右孩子 | 双亲结点 |
0 | a | 7 | -1 | -1 | 6 |