哈夫曼树(Huffman tree)->一种二叉树

哈夫曼树是一种特殊的二叉树,用于构造带权路径长度最小的树,适用于数据压缩和编码。通过贪心算法,每次合并权值最小的两棵树,最终形成权值大的叶节点更接近根节点的树形结构。哈夫曼树的带权路径长度具有最小值,且在编码时可避免二义性的前缀编码,常见应用为哈夫曼编码。
摘要由CSDN通过智能技术生成

知识前提:

一棵树的路径长度为从树根到其余各节点的路径长度之和

结点的带权路径长度为从根结点到该结点之间的路径长度与该结点上所带权值的乘积

每个叶结点的带权路径长度之和就是这棵树的带权路径长度

哈夫曼树定义:

假设有n个权值,构造有n个叶子的二叉树,每个叶子的权值就是n个权值之一,这样可以构造很多个,其中一个是带权路径长度最小的,这棵二叉树就被称为哈夫曼树或最优二叉树

哈夫曼树的构造,用到最小堆:

必须使权值越大的叶结点越靠近根节点,提出一种贪心算法,在初始状态下,将每个元素看作一棵独立的树,每次选择权值最小的两棵树进行合并

对于同一组给定权值叶结点所构造的哈夫曼树,树的形状可能不同。但无论形状如何,这些哈夫曼树的带权路径长度是相同的,并且一定都是同一最小值

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct node{
	int weight;
	struct node *left;
	struct node *right;
};
void PercolateDown(struct node *minHeap[],int loc,int *n){
	int i,child;
	struct node *temp=minHeap[loc];
	for(i=loc;i*2<=*n;i=child){
		child=i*2;
		if(child+1<=*n&&minHeap[child+1]->weight<minHeap[child]->weight)
			child++;
		if(temp->weight>minHeap[child]->weight)
			minHeap[i]=minHeap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值