哈夫曼树结构及带权路径长度

哈夫曼树:

当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。
在构建哈弗曼树时,要使树的带权路径长度最小,只需要遵循一个原则,那就是:权重越大的结点离树根越近。在图 1 中,因为结点 a 的权值最大,所以理应直接作为根结点的孩子结点。

哈夫曼树相关的几个名词

路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。

路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3。

结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图 1 中结点 a 的权为 7,结点 b 的权为 5。

结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。例如,图 1 中结点 b 的带权路径长度为 2 * 5 = 10 。

哈夫曼树结构及带权路径长度_第1张图片

构建哈夫曼树过程(1):

对于给定的有各自权值的 n 个结点,构建哈夫曼树有一个行之有效的办法:

  1. 在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
  2. 在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
  3. 重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。哈夫曼树结构及带权路径长度_第2张图片

 构建哈夫曼树过程(2):

 

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:


(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

 如:对 下图中的六个带权叶子结点来构造一棵哈夫曼树,步骤如下:

哈夫曼树结构及带权路径长度_第3张图片

哈夫曼树结构及带权路径长度_第4张图片

哈夫曼树结构及带权路径长度_第5张图片

 

哈夫曼树结构及带权路径长度_第6张图片

 哈夫曼树结构及带权路径长度_第7张图片

 哈夫曼树结构及带权路径长度_第8张图片

性质

每个初始结点都会成为叶子结点,双支结点都为新生成的结点
权值越大离根结点越近,反之离根结点越远
哈夫曼树中没有结点的度为1 (叶子节点:0 ,分支结点:2 )
n个叶子结点的哈夫曼树的结点总数为2n − 1,其中度为2的结点数位n − 1

 

你可能感兴趣的:(二叉树,霍夫曼树,数据结构)