哈夫曼树相关概念
- 应用领域:压缩(提高了网络的传输效率)
- 编码依据:最优二叉树(哈夫曼树)
- 相关概念:
- 节点的权(w):赋予叶子结点有意义的值
- 节点的路径长度(L):从根节点到当前节点的个数
- 节点的带权路径长度:w*L
- 一棵二叉树的带权路径长度:二叉树的所有叶子节点的带权路径长度之和
- 最优二叉树:二叉树的带权路径长度最小
- 最优二叉树的特点:
- 最优二叉树没有单亲节点,只有双亲节点和叶子结点
- 若叶子节点的个数是n,那么双亲节点的个数是n-1
最优二叉树的构建总体思路
- 以每一个节点为根节点构建的树组成森林;
- 从森林中获取权值最小的和次小的二叉树,构成新的二叉树,再放回森林;
- 重复第二步,直至森林中只有一棵树。
哈夫曼编码的总体思路
- 哈夫曼树采用的是数组存储
- 哈夫曼编码使用指针数组进行存储。数组首元素存储的是,哈夫曼编码的长度。
- 在求哈夫曼编码时,是从叶子结点开始回溯的。即从叶子结点找到双亲节点的下标,如果此叶子结点是双亲节点的左子女,则编码为0;若是右子女,则编码为1。循环在 叶子结点的双亲为-1结束
哈夫曼树的实现
用链表存储哈夫曼树
存储形式:
节点:
森林:用数组存储
- 算法描述
1.定义节点类型
//节点的结构
typedef struct node{
struct node *left,*right;//储存指向左右节点的指针
char word;//存储节点的表示
int weight;//存储节点的权重
}HuffNode;
2.定义森林数组并初始化
HuffNode **F;//指向动态数组的指针
int n;//数组的长度
//从键盘输入数组长度
printf("请输入数组长度:");
scanf("%d",&n);
//定义储存森林的数组
F = (HuffNode **)malloc(n*sizeof(HuffNode*));
//初始化森林
for(int i = 0;i<n;i++){
int w;//表示权重
char ch;//表示节点
//新建二叉树节点
F[i] = (HuffNode*)