目录
一,最优二叉树(哈夫曼树)
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。
最优二叉树是带权路径长度最短的树,权值较大的结点离根较近。
最优二叉树是Full Binary Tree (https://blog.csdn.net/nameofcsdn/article/details/114559547)
二,哈夫曼编码
以下是大一数据结构的实验课题:
根据所提供的字母数据建立一个Huffman树;
根据生成的Huffman树的结构,显示输出所有字母的Huffman编码。
代码:
#include <iostream>;
using namespace std;
struct huff
{
int weight; //weight用来保存权数
int parent = 0;
int lchild = 0;
int rchild = 0;
};
void code(char ch, huff huffman[]) //给每个字符编码
{
int i = 0; //i是字符ch的序号
if (ch != ' ')i = ch - 'a' + 1;
int coding[27]; //记录编码
int number = 0;
int temp = i;
while (huffman[temp].parent)
{
int t = huffman[temp].parent;
if (huffman[t].lchild == temp)coding[number] = 0;
else coding[number] = 1;
temp = t;
number++;
}
for (int j = number - 1; j >= 0; j--)cout << coding[j];
}
int _tmain(int argc, _TCHAR* argv[])
{
huff huffman[53];
int frequency[27] = { 186, 64, 13, 22, 32, 103, 21, 15, 47,57, 1, 5, 32, 20, 57, 63, 15, 1, 48, 51, 80, 23, 8, 18, 1, 16, 1 };
huffman[0].weight = 186;
for (int i = 1; i < 27; i++) //权数初始化
{
huffman[i].weight = frequency[i];
huffman[i + 26].weight = 0;
}
for (int i = 27; i < 53; i++) //建立huffman树
{
int min1 = 0;
int min2 = 1;
for (int j = 2; j < i; j++) //一次循环找出2个最小的权(父亲要为0的)
{
if (huffman[min1].parent)min1 = j;
else if (huffman[min2].parent)min2 = j;
else if (!huffman[j].parent)
{
if (huffman[j].weight < huffman[min1].weight)min1 = j;
else if (huffman[j].weight < huffman[min2].weight)min2 = j;
}
}
huffman[i].weight = huffman[min1].weight + huffman[min2].weight;
huffman[min1].parent = i; //记下父亲和孩子
huffman[min2].parent = i;
huffman[i].lchild = min1;
huffman[i].rchild = min2;
}
cout << "空格的编码是";
code(' ', huffman);
for (int i = 0; i < 26; i++)
{
char ch = 'a' + i;
cout << endl << ch << "的编码是" << " ";
code(ch, huffman);
}
system("pause>nul");
return 0;
}
运行结果: