//哈夫曼树与哈夫曼编码
/*哈夫曼树:有n个叶子结点的二叉树,并且每个叶子结点的权值是w,,从根节点到叶子结点的距离为l
则每个叶子结点的带权路径长度之和就是这个树的带权路径长度。*/
//构造哈夫曼树:把权值最小的两棵树合并,合并以后树的权值为这两个树权值的和,然后再进行合并。
typedef struct TreeNode{
int weight;//权值
struct TreeNode * left,right;
}HuffmanTree;
HuffmanTree * Huffman_creat(MinHeap * H){//哈夫曼树的本质就是每次从现有元素的权值中找出
//两个最小的,然后将他们组合成一个新的二叉树
//对于最小的权值,我们可以将所有元素的权值存入堆中
//利用最小堆找最小权值,最小堆里存储的是加了权值节点的指针
int i;
HuffmanTree * T;
Minheap_creat(H);
for(i=1;i<H->size;i++){ //合并i-1次后旧结点和合成后的新节点都被遍历
T=(HuffmanTree*)malloc(sizeof(HuffmanTree));
T->left=deleteMin(H);
T->right=deleteMin(H);
T->wight=T->left->weight+T->right->weight;
Insert(H,T);//将组合后的那个新节点再插回最小堆,后面的遍历中依然会考虑这个新节点的权值。
}
T=deleteMin(H);
return T;
}
哈夫曼树的创建
最新推荐文章于 2024-08-17 16:47:39 发布
哈夫曼树是一种带权路径长度最短的二叉树,用于创建哈夫曼编码。文章描述了通过使用最小堆来动态合并权值最小的节点,构建哈夫曼树的过程。在每次合并中,将两个权值最小的树组合成新的二叉树,并将新树的权值插入堆中,直至只剩下一个节点,即为哈夫曼树。
摘要由CSDN通过智能技术生成