哈夫曼树
带权路径长度: 设二叉树有n个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度。
哈夫曼树的定义:带权路径长度最小的二叉树(也称最优二叉树)
哈夫曼树的构建思路:
- 1、以权值分别为W1,W2...Wn的n各结点,构成n棵二叉树T1,T2,...Tn并组成森林 S={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的根结点;
- 2、在S中选取两颗权值最小的树min_1,min_2,将他们的权值相加,生成一个新的树(权值为刚才的min_1,min_2的权值之和),然后将新的这棵树放回到S中去,将刚才那两颗树min_1和min_2删掉。
- 3、重复2、3操作,知道S只剩下一棵树为止。这棵树即哈夫曼树。
代码实现:用顺序存储结构比较简单,
先分析一下,原本有n个树,最后只剩下一颗,也就是进行了n-1次合并操作,新生成了n-1个节点,也就是我们的存储空间至少2*n-1个来存储
哈夫曼树的抽象类型定义:
为了判断树节点是否在哈夫曼树中,我们用parents来辨别,初始化全为-1,当该节点插入到哈夫曼树中的时候,parents的值为该节点的双亲节点在数组的下标。
class HaFuman {
public:
int weight;//权重
int parents;//树的双亲节点
int lchird;
int rchild;
HaFuman() {//初始化全部为0
this->parents = -1;
this->lchird = -1;
this->rchild = -1;
}
};