哈夫曼树: 带权节点,对应的带权路径最小的一种树构造方法
以图一为例:51+24+33+41+4*2=34
怎么构建一个哈夫曼树,它又有什么特性呢
特点二:每个元素都是叶节点,n个叶节点有一个n-1个父节点再加最大父节点(顶上)
typedef struct TreeNode *HuffmanTree;
struct TreeNode
{
int Weight;
HuffmanTree Left, Right;
}
HuffmanTree Huffman(HeapStruct H) //传入一个堆
{
int i;HuffmanTree T;
BuildMinHeap(H);//改造成一个最小堆
for(i = 1;i<H->Size; i++) //n个元素合并n-1次
{
T = malloc(sizeof(struct TreeNode));
T->Left=DeleteMin(H);//不能再被访问
T->Right=DeleteMin(H);// 不能再被访问
T->Weight = T->Left+T->Right;
Insert(H,T);//见[堆](https://blog.csdn.net/weixin_45683677/article/details/104142819)
}
T =DeleteMin(H); //把最后的哪个最大值删了
return T;
}
看起来,哈夫曼树跟一般的树性能完全不同,还多了好多,看来只适应于把只能位于叶节点的权值存储
哈夫曼序列
用哈夫曼树
在叶节点上不会出现前缀(不会出现二义性)