首页 > 其他分享 >哈夫曼树建立

哈夫曼树建立

时间:2023-06-26 23:33:23浏览次数:32  
标签:哈夫曼 weight 建立 int HuffNode cd printf

#include <stdio.h>
#define  MAXVALUE  10000              /*定义最大权值*/
#define  MAXLEAF  30                      /*定义哈夫曼树中叶子结点个数*/
#define  MAXNODE  60                      /*定义哈夫曼树的结点数*/
#define  MAXBIT  10                        /*定义哈夫曼编码的最大长度*/

/*哈夫曼编码结构*/
typedef  struct {
	int  bit[MAXBIT];
	int  start;
}
HCodeType;

/*哈夫曼树结点结构*/
typedef  struct {
	char  data;
	int  weight;
	int  parent;
	int  lchild;
	int  rchild;
}
HNodeType;
/*哈夫曼树的构造算法*/
void    HuffmanTree(HNodeType  HuffNode[], int  n);
/*生成哈夫曼编码*/
void    HuffmanCode(HNodeType  HuffNode[], HCodeType  HuffCode[], int  n);

void    HuffmanTree(HNodeType  HuffNode[], int  n) {
	int i, j, m1, m2, x1, x2;
	for (i = 0; i < n - 1; i++) {
		m1 = m2 = MAXVALUE;
		x1 = x2 = 0;
		for (j = 0; j < n + i; j++) {
			if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1) {
				m2 = m1;
				x2 = x1;
				m1 = HuffNode[j].weight;
				x1 = j;
			} else if (HuffNode[j].weight < m2 &&
			           HuffNode[j].parent  == -1) {
				m2 = HuffNode[j].weight;
				x2 = j;
			}
		}
		HuffNode[x1].parent = n + i;
		HuffNode[x2].parent = n + i;
		HuffNode[n + i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
		HuffNode[n + i].lchild = x1;
		HuffNode[n + i].rchild = x2;
	}

}

void  HuffmanCode(HNodeType  HuffNode[], HCodeType  HuffCode[], int  n) {
	HCodeType cd;
	int i, j, c, p;
	for (i = 0; i < n; i++) {
		cd.start = n - 1;
		c = i;
		p = HuffNode[i].parent;
		while (p != -1) {
			if (HuffNode[p].lchild == c)
				cd.bit[cd.start] = 0;
			else
				cd.bit[cd.start] = 1;
			cd.start--;
			c = p;
			p = HuffNode[p].parent;
		}
		for (j = cd.start + 1; j < n; j++)
			HuffCode[i].bit[j] = cd.bit[j];
		HuffCode[i].start = cd.start;
	}

}

int  main() {
	HNodeType  HuffNode[MAXNODE];
	HCodeType  HuffCode[MAXLEAF];
	int  n, i, j;
	scanf("%d", &n);
	getchar();
	/*数组HuffNode[  ]初始化*/
	for  (i = 0;  i < 2 * n - 1;  i++) {
		HuffNode[i].data = '0';
		HuffNode[i].weight = 0;
		HuffNode[i].parent = -1;
		HuffNode[i].lchild = -1;
		HuffNode[i].rchild = -1;
	}
	/*输入n个叶子结点的权值*/
	for  (i = 0;  i < n;  i++) {
		scanf("%c,%d", &HuffNode[i].data, &HuffNode[i].weight);
		getchar();
	}
	HuffmanTree(HuffNode, n);
	printf("HuffTable:\n");
	for (i = 0;  i < 2 * n - 1;  i++) {
		putchar(HuffNode[i].data);
		printf("  %d", HuffNode[i].weight);
		printf("  %d", HuffNode[i].parent);
		printf("  %d", HuffNode[i].lchild);
		printf("  %d", HuffNode[i].rchild);
		printf("\n");
	}
	printf("HuffCode:\n");
	HuffmanCode(HuffNode, HuffCode, n);
	/*输出每个叶子结点的哈夫曼编码*/
	for  (i = 0;  i < n;  i++) {
		printf("%c:", HuffNode[i].data);
		for (j = HuffCode[i].start + 1;  j < n;  j++)
			printf("%d", HuffCode[i].bit[j]);
		printf("\n");
	}
	return  0;
}

标签:哈夫曼,weight,建立,int,HuffNode,cd,printf
From: https://blog.51cto.com/u_16030624/6558759

相关文章

  • 如何建立Linux与git的连接?
    @[Toc]本文以Xshell为案例进行与git的连接!建立连接三板斧:add,commit,pushLinux与git远程连接的方法:1.设置全局的用户名和邮箱gitconfig--globaluser.name"你的用户名"gitconfig--globaluser.email"你的邮箱"2.先创建本地文件夹mkdirtest3.cd进入本地仓库cdtest4......
  • 18.哈夫曼编码
    哈夫曼(Huffman)编码算法是基于二叉树构建编码压缩结构的,它是数据压缩中经典的一种算法。算法根据文本字符出现的频率,重新对字符进行编码。首先请大家阅读下面两段中外小学作文:中国-今天天气晴朗,我和小明出去玩!小明贪玩,不小心摔了一跤,小明被摔得哇哇哭了,小明的爸爸闻声赶来,又把小......
  • 语音信号的哈夫曼编码压缩解压缩算法matlab仿真,输出编码后数据大小,编码树等指标
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要        利用哈夫曼编码进行信息通信可以较大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码......
  • ubuntu安装nginx建立静态站
    版本:服务器ubuntu20.04本地windows10远程工具xshell71、nginx官网 http://nginx.org/en/docs/2、点击installingnginx3、点击 InstallationonLinux下的packages4、点击Ubuntu5、开始傻瓜式操作,一定!一定!一定!使用root安装和使用nginx哦!我以下所有执行都是roo......
  • 如何建立个人自己的数据库?
    选择数据库软件首先你需要选择合适的数据库软件,目前比较流行的有MySQL、PostgreSQL、SQLite等。这里我们以MySQL为例进行介绍。下载和安装MySQL你可以从MySQL官网上下载MySQLCommunityServer的安装包,然后按照安装向导进行安装。配置MySQL安装完成后,你需要配置MySQL的一些......
  • 35. 图的建立
    一、邻接矩阵表示图1.1、图的表示  节点数为n的图\(G=(V,E)\)的邻接矩阵A是n*n的。将G的顶点编号为\(v_{1},v_{2},...,v_{n}\),则\[A[i][j]=\begin{cases}1&,若(v_{i},v_{j})或<v_{i},v_{j}>是E(G)中的边\\0&,若(v_{i},v_{j})或<v_{i},v_{j}>不......
  • [转]火狐浏览器访问github提示:未连接:有潜在的安全问题...github.com 启用了被称为 HTT
    火狐浏览器访问github,提示:       未连接:有潜在的安全问题;       Firefox检测到潜在的安全威胁,并因github.com要求安全连接而没有继续。如果这种情况是因为使用DevSidecar而引起的,可以使用以下方式解决:在地址栏输入:about:config在搜索框输入:security.en......
  • 最新Android音视频开发学习指南,建立自己的技术护城河
    我们常说音视频是程序员小众领域,但其实音视频技术在日常生活中随处可见:直播中要保证在各种网络状况下实现超低价延时、降低卡顿率,就需要用到音视频中的RTC和直播技术;上百人的视频会议若要保证流畅度和清晰的画质就要用到RTC和转码合流服务等技术…Android音视频开发进阶指南目......
  • Polardb 如何替换MYSQL 之 IMCI 列式(1)建立一个列式引擎
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。讲了那么多期,都是在力量上进行论述,本期开始进入到正式的POALRDB的内部操作中,POLARDB与MYSQL在登录中最大的不同是,你可以通过代......
  • POSTGRESQL SQL 优化,不建立索引,不调整参数,不修改SQL的另类方式
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,软件架构师,软件开发大佬,可以解决你的问题。在MYSQL中很少听说过自建统计信息,实际上在其他数据库中,创建统计信息的方式和需求都是有的,尤其处理复杂SQ......