一、 概念
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为哈夫曼树;哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
二、 过程
初始化值
节点 | 权值 |
---|---|
A | 12 |
B | 24 |
C | 35 |
D | 67 |
E | 46 |
F | 55 |
2.1 建立
每次从所有节点中选出最小权值节点与次小权值节点,合并;重复操作至所有节点合并为一棵树
2.2 编码
对建立好的哈夫曼树,所有节点左儿子编为0,右儿子编为1,实现对各节点的编码
三、 代码
3.1 数据定义
#define LENGTH 6
// 用以进行哈夫曼编码
int code[20];
// 用以保存每个节点的哈夫曼编码
string huffman[LENGTH];
// 权值
int arr[LENGTH] = {
12,24,35,67,46,55};
// 节点
char alph[LENGTH] = {
'A','B','C','D','E','F'};
typedef struct Tree {
//节点的权值
int data;
Tree* leftSon;
Tree* rightSon;
Tree(int data,Tree* leftSon,Tree* rightSon){
this->data = data;
this->leftSon = leftSon;
this->rightSon = rightSon;
}
} Tree, *TreeList;
3.2 建树
//建哈夫曼树,返回根节点
TreeList createTree(int arr[]) {
//建立指vector用来保存节点信息
vector<TreeList> v;
for (int i = 0; i < LENGTH; i++) {
TreeList leaf = new Tree(arr[i], nullptr, nullptr);
v.push_back(leaf);
}
//哈夫曼树的根节点
TreeList root