给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
这是百度搜素给的定义,从严格意义上来说哈夫曼树并不是二叉的而是多叉的,二叉树只是一种形式也是最常见的形式。这一点在百度搜素中也有注明,只是需要做一下调整,构造哈夫曼树的思想是每次选k个权重最小的元素来合成一个新的元素,该元素权重为k个元素权重之和。但是当k大于2时,按照这个步骤做下去可能到最后剩下的元素少于k个。解决这个问题的办法是假设已经有了一棵哈夫曼树(且为一棵满k叉树),则可以计算出其叶节点数目为(k-1)nk+1,式子中的nk表示子节点数目为k的节点数目。于是对给定的n个权值构造k叉哈夫曼树时,可以先考虑增加一些权值为0的叶子节点,使得叶子节点总数为(k-1)nk+1这种形式,然后再按照哈夫曼树的方法进行构造即可。
那么为什么哈夫曼树会让编码唯一呢?
我们每次构建的时候会发现父节点都不是数据构成的,那么也就是说所有的数据都存放在叶子节点中,对于每个数据而言从顶点到它的路径上是不会有任何数据的也就保证了路径的唯一性。