【MOOC】Binary Part -IV Huffman Tree && Huffman Coding

Huffman Tree

带权路径长度(WPL):二叉树有n个叶子结点,每个叶子结点带有权值Wk,从根结点到每个叶结点的长度为lk,则每个叶子结点的带权路径长度之和就是WPL.

最优二叉树或者哈夫曼树:WPL最小的二叉树


哈夫曼树的构造方法:

每次把权值最小的两颗二叉树合并。

这里利用最小堆的特性,构造一个最小堆,每次返回最小的结点,返回两次则可以作为哈夫曼树的左右结点,权值为左右结点之和,将这个新的结点插入到最小堆中,继续上面的操作。

时间复杂度O(N logN)

typedef struct TreeNode *HuffmanTree;
struct TreeNode
{
	int weight;
	HuffmanTree left;
	HuffmanTree right;
};
 
HuffmanTree Huffman(MinHeap H)
{
	int i;
	HuffmanTree T;
	
	BuildMinHeap(H);
	for (i = 1; i<H->size; i++){
		T = (HuffmanTree)malloc(sizeof(struct TreeNode));
		T->left = Delete(H);
		T->right = Delete(H);
		T->weight = T->left->weight+T->right->weight;
		Insert(H, T);
	}
	T = Delete(h);
	return t;
}

Huffman树的特点:

>没有度为1的结点

>n个叶子结点的Huffman树共有2n-1个结点

>哈夫曼树的任意非叶子结点的左右子树交换后,仍然是Huffman树

>对同一组权值,可能存在不同构的两棵Huffman树


Huffman Coding

优点:不定长编码,存储空间最少

注意 :

避免二义性:前缀码:prefix code:任何字符的编码都不是另一字符编码的前缀,可以无二义的解码。

需要保证所有的字符都在叶结点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值