给定N个权值为N的叶子节点,构造一颗二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也成为霍夫曼树。霍夫曼树是带权路径长度最短的树,权值最大的节点离根较近。
根据霍夫曼树的特性可以得知,权值越大的叶子节点越靠近根节点。构造霍夫曼树的算法称为霍夫曼算法。
如果输入权值为(w1,w2,w3,…,wn)的n个节点,要求输出相对应的霍夫曼树,那怎么办呢?过程如下:
例如将以5,15,20,30,10为权的W构造成霍夫曼树,过程如图1所示。
霍夫曼树用于通讯及数据传送中对信息的二进制编码。
- #include
- using namespace std;
- //哈夫曼的存储结构
- typedef struct{
- int weight;
- int parent,lchild,rchild;
- }HTNode, *HuffmamTree;
- //选两个权值最小的结点
- void Select(HuffmamTree &HT, int n, int &s1, int &s2){
- int min;
- for(int i=1; i<=n; i++)
- {
- if(HT[i].parent==0)
- {
- min=i;
- break;
- }
- }
- for(int j=1; j<=n; j++)
- {
- if(HT[j].parent==0)
- {
- if(HT[j].weight
- {
- min=j;
- }
- }
- }
- s1=min;
- for(int i=1; i<=n; i++)
- {
- if(HT[i].parent==0&&i!=s1)
- {
- min=i;
- break;
- }
- }
- for(int j=1; j<=n; j++)
- {
- if(HT[j].parent==0&&j!=s1)
- {
- if(HT[j].weight
- {
- min=j;
- }
- }
- }
- s2=min;
- }
- //输出哈夫曼树状态表
- void Show(HuffmamTree HT,int m){
- cout<<"==============================="<
- for (int i = 1; i <= m; ++i) {
- cout<". "<
" "<" "<" "< - cout<<"-------------------------"<
- }
- }
- //创建哈夫曼树
- void CreateHuffmanTree(HuffmamTree &HT,int n){
- //初始化构造n个结点的哈夫曼树
- if(n<=1)
- {
- return;
- }
- int m=n*2-1;
- HT=new HTNode[m+1];
- for(int i=0; i <= m; i++)
- {
- HT[i].parent=0;
- HT[i].lchild=0;
- HT[i].rchild=0;
- HT[i].weight=0;
- }
- for(int j=1; j<=n; j++)
- {
- cout<<"请输入第"<
"个结点的权值:"; - cin>>HT[j].weight;
- }
- //输出哈夫曼树初态表
- cout<<"HT的初态:"<
- Show(HT,m);
- //创建哈夫曼树
- int s1,s2;
- for(int i=n+1; i<=m; i++)
- {
- Select(HT,i-1,s1,s2);//从HT[k](1 <= k <= i-1)中获得两个权值最小的结点的位置
- HT[s1].parent=i;//将s1 s2位置的结点的双亲域改为i
- HT[s2].parent=i;
- HT[i].lchild=s1;//s1 s2分别作为结点i的左右子树
- HT[i].rchild=s2;
- HT[i].weight=HT[s1].weight + HT[s2].weight;//i结点的权值等于左右子树权值之和
- }
- //输出哈夫曼树终态表
- cout<<"HT的终态:"<
- Show(HT, m);
- }
- int main()
- {
- HuffmamTree HT;
- int n;
- cout<<"请输入叶子节点个数:";
- cin>>n;
- CreateHuffmanTree(HT,n);
- return 0;
- }
参考文献:
-
相关阅读:
同时显示上下两层凸包特征的可视化程序
算法竞赛进阶指南 0x65 负环与差分约数
安全渗透测试基础之-Nessus漏洞扫描工具(安装下载)
微信自动批量添加好友的方法
Linux软件安装方式 - Tarball&RPM&YUM
网络基础(day3)建议在电脑端注册登陆观看!!!
shopify独立站的运营
nginx和gunicorn相关,反向代理和正向代理区别,静态资源和动态资源
设计模式-桥接模式
运行软件找不到mfc140u.dll怎么解决,mfc140u.dll是什么文件
-
原文地址:https://blog.csdn.net/weixin_46522531/article/details/126590176