HuffmanTree

article/2025/9/29 1:13:33
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"typedef int ELEMTYPE;//哈弗曼树节点结构体
typedef struct HuffmanTree
{ELEMTYPE weight;ELEMTYPE id;//区分权值相同的节点struct HuffmanTree* lchild;struct HuffmanTree* rchild;
}HuffmanNode;//构建哈弗曼树
HuffmanNode* createHuffmanTree(int* T,int n)
{int i,j;HuffmanNode **temp,*huffmanTree;temp =(HuffmanNode**)malloc(n*sizeof(HuffmanNode));//将数组T中的权值赋值给节点中的weightfor(i=0;i<n;i++){temp[i]=(HuffmanNode*)malloc(sizeof(HuffmanNode));temp[i]->weight =T[i];temp[i]->id =i;temp[i]->lchild =temp[i]->rchild =NULL;}//构建哈弗曼树需要N-1合并for(i=0;i<n-1;i++){int small1=-1,small2;//将small1和small2分别作为最小值和次小值的下标//先将最小的两个下标赋值给small1和small2,对应权值未必最小for(j=0;j<n;j++){if(temp[j]!=NULL&&small1==-1){small1=j;continue;}else if(temp[j]!=NULL){small2=j;break;}}for(j=small2;j<n;j++)//比较权值,挪动small1和small2使之分别成为最小权值和次小权值的下标{if(temp[j]!=NULL){if(temp[j]->weight<temp[small1]->weight ){small2=small1;small1=j;}else if(temp[j]->weight<temp[small2]->weight){small2=j;}}}huffmanTree=(HuffmanNode*)malloc(sizeof(HuffmanNode));huffmanTree->weight =temp[small1]->weight +temp[small2]->weight;huffmanTree->lchild =temp[small1];huffmanTree->rchild =temp[small2];temp[small1]=huffmanTree;temp[small2]=NULL;}free(temp);return huffmanTree;
};//以广义表的形式打印哈弗曼树
void PrintHuffmanTree(HuffmanTree* huffmanTree)
{if(huffmanTree){printf("%d",huffmanTree->weight );if(huffmanTree->lchild !=NULL || huffmanTree->rchild !=NULL){printf("(");PrintHuffmanTree(huffmanTree->lchild);printf(",");PrintHuffmanTree(huffmanTree->rchild);printf(")");}}
};//求带权路径长度
ELEMTYPE WeightPthLength(HuffmanNode *huffmanTree,int len)
{if(huffmanTree==NULL) return 0;else {if(huffmanTree->lchild==NULL &&huffmanTree->rchild ==NULL) return huffmanTree->weight *len;else return WeightPthLength(huffmanTree->lchild ,len+1)+WeightPthLength(huffmanTree->rchild,len+1);}
}//递归哈夫曼编码
void Huffman_code(HuffmanNode* huffmanTree,int depth)
{static int code[10];if(huffmanTree){if(huffmanTree->lchild ==NULL&&huffmanTree->rchild ==NULL){printf("id为%d权值为%d的叶子节点的哈夫曼编码为",huffmanTree->id ,huffmanTree->weight );int i;for(i=0;i<depth;i++){printf("%d",code[i]);}printf("\n");}else{code[depth]=0;Huffman_code(huffmanTree->lchild,depth+1);code[depth]=1;Huffman_code(huffmanTree->rchild,depth+1);}}
}
int _tmain(int argc, _TCHAR* argv[])
{int i,n,*arr,WPL,len=0;printf("请输入叶节点的个数:\n");while(1){scanf("%d",&n);if(n>1)break;else printf("输入错误,请重新输入:");}arr=(int*)malloc(n*sizeof(ELEMTYPE));printf("请输入%d个叶节点的权值:\n",n);for(i=0;i<n;i++){scanf("%d",&arr[i]);}HuffmanTree* huffmanTree=NULL;huffmanTree=createHuffmanTree(arr, n);printf("此哈弗曼树的广义表形式为:\n");PrintHuffmanTree(huffmanTree);printf("\n");WPL=WeightPthLength(huffmanTree,len);printf("WPL=%d\n",WPL);printf("此哈弗曼树的叶节点的编码为:\n");Huffman_code(huffmanTree,0);system("pause");return 0;
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/wuESCu7U.shtml

相关文章

JPEG中Huffman解码实例讲解

DHT Huffuman表格式 -------------------------------------------------------------------------- 名称 字节数 值 说明 -------------------------------------------------------------------------- 段标识 1 FF 段类型 1 C4 段…

哈夫曼树(huffman)

学完了huffman树&#xff0c;讲一下自己对它的理解 huffman树遵循二叉树的原则&#xff0c;每个节点最多有两个子节点&#xff0c;但是每个节点都带有一个权重&#xff0c;如果我们要将一组字符串 “ B D C A F E ” 插入huffman树&#xff0c;每个字符都会带有一个权重&#…

Huffman树和Huffman编码

文章目录 Huffman树的定义带权路径长度WPL Huffman树的构造Huffman树的特点 Huffman编码构造Huffman编码 Huffman树的定义 哈夫曼&#xff08;Huffman&#xff09;树&#xff0c;又称最优二叉树&#xff0c;是一类带权路径长度WPL最短的树。 带权路径长度WPL 要理解带权路径…

Huffman树(哈夫曼树)

哈夫曼树又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓树的带权路径长度&#xff0c;就是树中所有的叶结点的权值乘上其到根结点的路径长度&#xff08;若根结点为0层&#xff0c;叶结点到根结点的路径长度为叶结点的层数&#xff09;。树的带权路径长度记为…

虚拟机下安装BackTrack5 (BT5)教程及BT5汉化

isare邀请您访问Backtrack中文网 http://www.backtrack.org.cn/?fromuid50397 isare邀请您访问Backtrack中文网 http://www.backtrack.org.cn/?fromuserisare PS&#xff1a;back track 安装过程中有2点要注意&#xff1a;第一&#xff1a;复制到99%的时候会等大约10来分钟&a…

bt 下载工具 deluge 配置 优化 使用

目录 Ubuntu 18 配置 deluge Deluge 安卓远程客户端 Deluge 性能调优 deluge是基于libtorrentpython的跨平台bt/pt客户端&#xff0c;适合在Linux环境下使用 deluge完全开源免费&#xff0c;对IPv6支持良好&#xff0c;性能优于transmission&#xff1b;在嵌入式设备上使用d…

BT5的U盘完整安装

BT5是什么就不用多说了&#xff0c;从网上看了许多教程&#xff0c;大多是利用unetbootin工具将ISO文件直接解压到U盘上&#xff0c;这样并不能完全使用BT&#xff0c;保存好的文件&#xff0c;重启机器后就没了&#xff0c;其实就是当做光盘使用了&#xff0c;另外还有一个方法…

有哪些好用的BT下载器?

​​​​​​2022年5个好用的 BT/ 磁力链接下载工具推荐 &#xff5c;Windows 、安卓系统 | 科技雷达 A full-featured download manager

BT是如何下载的

BT协议简介 一、BT下载是怎么来的&#xff1f; 在互联网上下载文件的方式大概有这么几种&#xff1a;FTP、HTTP、BT、eMule(电驴)等&#xff0c; 浏览器会直接支持FTP和HTTP下载&#xff0c;BT和eMule下载一般需要专用的下载软件的支持。 接下来分别简单介绍一下他们的区别&…

ed2k下载

ed2k下载 在下载ed2k资源的时候&#xff0c;浏览器一般不能直接下载&#xff0c;这个时候该怎么办呢&#xff1f; 方法一&#xff1a;下载迅雷&#xff0c;直接安装 方法二&#xff1a;使用在线工具&#xff0c;将链接转化为别的形式 https://tool.lu/urlconvert/ 方法三&am…

BT是怎么下载的

BT协议简介 一、BT下载是怎么来的? 在互联网上下载文件的方式大概有这么几种:FTP、HTTP、BT、eMule(电驴)等, 浏览器会直接支持FTP和HTTP下载,BT和eMule下载一般需要专用的下载软件的支持。 接下来分别简单介绍一下他们的区别: FTP 是 File Transfer Protocol(文件…

最好用的bt下载器qbittorrent下载安装使用教程

qBittorrent绝对是我心目中BT下载工具中的NO.1&#xff0c;虽说我平时也会用迅雷下载国内的某些资源&#xff0c;但是仍然不妨碍它是我心目中的主力下载神器&#xff01;它可以说是我最早接触的除迅雷之外的一款BT下载神器。它是完全免费的种子和磁力链接下载工具&#xff0c;最…

BT5 WIFI破解

实验环境 VMwareWorkstation 9.0 BackTrack5 R3-GNOME-32 工具说明 VMware&#xff1a;著名的虚拟机软件&#xff0c;本实验采用虚拟机环境下安装BackTrack。 BackTrack&#xff1a;是一个基于Ubuntu GNU/Linux的发行版本&#xff0c;主要用做数字取证和入侵测试。其无线安全审…

BT5下载地址

http://www.backtrack-linux.org/downloads/ 下载方法&#xff1a; 1,先填写好网页里的三个框,如: Your Name(你的名字): ABC Email Address(邮箱): ABC163.com Country(国家): china 2,然后点"download" 3,按照自己的…

最全BT介绍

BitTorrent 简介 riba2534 2021年04月11日 19:26 阅读 851 关注 BitTorrent 简介 从 P2P 说起 经常在网上飙车的老司机应该都知道 BT 下载&#xff0c;但是有时候拿到了种子却下载不动&#xff0c;会不会很抓狂&#xff0c;是不是还觉得是自己网不行&#xff0c;那作为一…

034_Unicode标准

1. Unicode标准 1.1. 由于ASCII字符集、ISO字符集、GBK字符集列出的字符集都有容量限制, 而且不兼容多语言环境, Unicode联盟开发了Unicode标准。 1.2. Unicode标准涵盖了世界上的所有字符、标点和符号。 1.3. 不论是何种平台、程序或语言, Unicode都能够进行文本数据的处理…

24.字符编码

1.字符编码 1.1简介 字符编码只与文本文件和字符串有关。 字符编码&#xff1a;记录人类字符与二进制数的对应关系。计算机只能识别二进制&#xff0c;但是通过字符编码可以展示出各式各样的语言字符。1.2发展过程 1.计算机是美国人发明的&#xff0c;为了能够让加计算机能够…

汉字编码

http://blog.csdn.net/zzidea/article/details/8497532 C语言编程&#xff0c;基本的类型有字符型&#xff0c;整数型&#xff0c;浮点型。这些类型是我们对事物进行描述所必不可少的东西。即基础&#xff0c;又非常核心。所以必须掌握。 一、 字符集 ASCII GB2…

《Qt5:键盘事件》

QKeyEvent类用来描述了一个键盘事件。常用的键盘事件有两种&#xff1a;按键按下和按键释放&#xff0c;一般按键按下事件用的多一点&#xff0c;下面为键盘按下和释放事件的声明&#xff1a; public:void keyPressEvent(QKeyEvent *event);void keyReleaseEvent(QKeyEvent *ev…

小伙 这样你就可以在Mac 中运行 Office 办公软件了

小伙 这样你就可以在Mac 中运行 Office 办公软件了 请参考以下步骤&#xff1a; 1、打开已经安装好的 CrossOver&#xff0c;点击“安装 Windows 应用程序”&#xff0c;在选择应用中的搜索框中输入“office”&#xff0c;接下来在下拉列表中会出现非常多的已经列出的相关软件&…