最优二叉树(哈夫曼树)

目录

一,最优二叉树(哈夫曼树)

二,哈夫曼编码


一,最优二叉树(哈夫曼树)

给定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;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/114504296