首页 > 其他分享 >哈夫曼树哈夫曼编码

哈夫曼树哈夫曼编码

时间:2023-11-30 15:35:00浏览次数:20  
标签:编码 parent weight int 哈夫曼 HT s2

哈夫曼树哈夫曼编码  

输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。

#include<iostream>
#include<cstring>
using namespace std;
typedef char**HuffmanCode;

typedef struct
{
int weight;
int lchild,rchild,parent;
}HTNode,*HuffmanTree;
void min(HuffmanTree HT,int pos,int &s1,int &s2)
{
s1=pos;s2=pos;
for(int i=pos-1;i>=1;i--)
{
if(HT[i].parent==0&&HT[i].weight<=HT[s1].weight)
s1=i;
}
for(int i=pos-1;i>=1;i--)
{
if(HT[i].parent==0&&HT[i].weight<=HT[s2].weight&&i!=s1)
s2=i;
}
}
void CreatHT(HuffmanTree &HT,int n)
{
if(n<=1)
return;
int m=2*n-1;
HT=new HTNode[m+1];
for(int i=1;i<=m;++i)
{
HT[i].weight=0;HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;
}
for(int i=1;i<=n;i++)
cin>>HT[i].weight;
for(int i=n+1;i<=m;i++)
{
int s1,s2;
min(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}
void CreatHC(HuffmanTree HT,HuffmanCode &HC,int n)
{
HC=new char*[n+1];
char *cd=new char[n];
cd[n-1]='\0';
for(int i=1;i<=n;i++)
{
int start =n-1;
int c=i,f=HT[i].parent;
while(f!=0)
{
if(c==HT[f].lchild)cd[--start]='0';
else cd[--start]='1';
c=f;
f=HT[c].parent;
}
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
delete cd;
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
int n,WPL=0,j;
cin>>n;
if(n>1)
{
CreatHT(HT,n);
CreatHC(HT,HC,n);
for(int i=1;i<=n;i++)
{
cout<<HT[i].weight<<"编码为";
for(j=0;HC[i][j]!='\0';j++)
{
cout<<HC[i][j];
//WPL+=j*HT[i].weight;
//cout<<endl;
//WPL=WPL+HT[i].weight*j;
}
//cout<<"WPL:"<<WPL;
WPL=WPL+HT[i].weight*j;
cout<<endl;

}
cout<<"WPL:"<<WPL;
}
else{
cout<<"error";
}
return 0;
}

标签:编码,parent,weight,int,哈夫曼,HT,s2
From: https://www.cnblogs.com/zh-ang-zhang/p/17867483.html

相关文章

  • C++使用OpenSSL实现Base64编码、解码实例----亲测OK
    摘自:https://www.dandelioncloud.cn/article/details/1498198300963708930 //Base64Util.h#ifndef__BASE64_UTIL_H__#define__BASE64_UTIL_H__#ifdef__cplusplus//告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的extern"C"{#endifstringUTIL......
  • url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
    引子浏览器URl地址,上网一定会用到,但是浏览器地址有中文或者浏览器url参数操作的时候,经常会用到encodeURIComponent()和decodeURIComponent()以及encodeURI()等等。关于浏览器参数操作,请看文章javascript浏览器参数的操作,js获取浏览器参数 ,今天主要讲讲escape(),encodeURI(),enco......
  • JavaScript编码风格指南
    sidebar:autosidebarDepth:4JavaScript编码风格指南内容出处:NicholasC.Zakas《编写可维护的JavaScript》GoogleJavaScriptStyleGuidecrockfordJSLintESLint好狗电影导航源文件基础命名文件名必须全部小写,并且可以包含下划线(_)或短划线(-),但不包含......
  • Base64编码、解码 C语言例子(使用OpenSSL库)
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<openssl/pem.h>#include<openssl/bio.h>#include<openssl/evp.h>intbase64_encode(char*in_str,intin_len,char*out_str){BIO*b64,*bio;......
  • 第三章 编码风格
    第三章编码风格注释总结起来一句话:优秀的代码本身就容易阅读,注释只需要提供有用的附加信息分解分解(decomposition)指将代码分为小段.理想情况下,每个函数或方法都应该只完成一个任务.任何非常复的子任务都应该分解为独立的函数或方法.重构(refactoring)指重新构建代......
  • 自定义应用层通信协议结构消息的编码方式
    应用层通信协议设计 一、应用层通信协议概述TCP/UDP是基于字节流的传输层通信协议,对于其的编程是基于IO流编程,所谓“流”,就是没有界限的一长串二进制数据。TCP/UDP作为传输层协议,并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分。所以在业务上......
  • Netty源码学习6——netty编码解码器&粘包半包问题的解决
    系列文章目录和关于我零丶引入经过《Netty源码学习4——服务端是处理新连接的&netty的reactor模式和《Netty源码学习5——服务端是如何读取数据的》的学习,我们了解了服务端是如何处理新连接并读取客户端发送的数据的:netty的reactor:主reactor中的NioEventLoop监听accept事件,然......
  • C++ 字符串编码转换封装函数,UTF-8编码与本地编码互转
    简介字符串编码转换封装函数,UTF-8编码与本地编码互转。中文乱码的解决方法有时候我们会遇到乱码的字符串,比如:古文码可能是用GBK方式读取UTF-8编码的中文导致的,用下面的Utf8ToLocal(stringstr)函数转换一下就可以了。口字码可能是因为以UTF-8的方式读取GBK编码的中文导致的,用下面......
  • 字符串的解码和编码
    #str表示字符串类型转为bytes类型(二进制类型)s='伟大的中国梦'scode=s.encode(errors='replace')#默认是utf-8,因为utf-8每个中文占3个字节print(scode)#所以输出18位字节#输出结果为:\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe4\xb8\xad\xe5\x9b\xbd\xe6\xa2\xa6#用_gbk方式s......
  • 求解--如何把图片的base64编码转换成图片(未解决)
    问题描述将图片弄好之后,并且显示我弄成功了,但是就是找不到图片保存到哪里了;然后发现可以将base64编码转换成图片,但是不会转~~~求解救呀~~~问题解决未解决!!!......