哈夫曼树的创建和哈夫曼树编码及解码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct huffman {
int weight;
int parent, lchild, rchild;//parent放双亲再数组中的下标
}Hufnode,*HufTree;
typedef char** HuffmanCode;//动态二维数组,可看作若干个一维数组组成
void Creat_Huffmancode(HufTree HT, HuffmanCode * HC, int n)//寻找字符对应的编码,我们从叶子结点出发
//一直到根结点
{
*HC = (HuffmanCode)malloc((n + 1) * sizeof(char*));
char* ch = (char*)malloc(n * sizeof(char));//森林有n个根结点,临时数组ch就需要n个空间
//(实际是n-1,但最后一个存放'\0')
ch[n - 1] = '\0';
for (int i = 1; i <= n; i++)//n个森林中的根结点存放在哈夫曼树数组中的1-n中
{
int start = n - 1;
int c = i;
int f = HT[i].parent;
while (f != 0)
{
start--;
if (HT[f].lchild = c)
ch[start] = 0;
else
ch[start] = 1;
c = f;
f = HT[f].parent;
}
(*HC)[i] = (char*)malloc((n - start) * sizeof(char));
strcpy((*HC)[i], &ch[start]);//将临时数组中不为0的第一个元素开始复制到
}
}
void select(HufTree HT, int i, int& s1, int& s2)//&是传址调用,会将形参中s1的值返回给实参
{
int min = 1;
for (int n = 2; n <= i; n++)
{
if (HT[n].parent==0)//双亲是0表示是森林中的根结点
{
if ( HT[min].weight> HT[n].weight)//选取权最小的元素的下标
min = n;
}
}
s1 = min;
min = 1;
for (int n = 2; n <= i; n++)
{
if (HT[n].parent==0&&n!=s1)//不能是权第一小元素的下标
{
if (HT[min].weight > HT[n].weight)
min = n;
}
}
s2 = min;
}
HufTree Creat_HuffmanTree(int n)
{
int x;
int m = 2 * n-1;
HufTree HT;//定义一个指针,指针就相当于数组,把指针看作数组
HT = (HufTree)malloc((m+1)*sizeof(Hufnode));//给数组开辟空间,数组中要放m+1个元素
//初始化
for (int i = 1; i <= m; i++)//从下标为1到m
{
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for (int i = 1; i <= n; i++)
{
scanf_s("%d", &x);
HT[i].weight = x;
}
int s1, s2;
for (int i = n - 1; i <= m; i++)
{
select(HT, i-1,s1,s2);//选用两小造新树
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
}
return HT;
}
void Unite_Huffmancode(HufTree HT, int code[],int num,int n)//解码
{
int p=n;
for (int i = 0; i < num; i++)
{
while (HT[p].lchild != 0)
{
if (code[i] = 0)
p = HT[p].lchild;
else
p = HT[p].rchild;
}
printf("%d ", HT[p].weight);
p = n;
}
}
int main()
{
HufTree HT = Creat_HuffmanTree(3);
return 0;
}
哈夫曼树的创建和哈夫曼树编码及解码相关推荐
- 哈夫曼树的创建和哈夫曼编码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> # ...
- 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码
//严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...
- 赫夫曼树的创建(思路分析)
赫夫曼树的创建(思路分析) 构成赫夫曼树的步骤: 从小到大进行排序,将有一个数据(每一个数据其实就是一个节点)看做是一颗最简单的二叉树 取出根节点权值最小的两颗二叉树(其实就是取出权值最小的两个结点) ...
- c语言实现哈夫曼树的创建与中序遍历以及哈夫曼编码(附详细代码)
任务描述 本关任务:编写能对给定n个叶子结点,构建哈夫曼树,给出每个叶子结点对应编码的程序. 相关知识 哈夫曼编码和译码的基本原理 首先要构造一棵哈夫曼树.哈夫曼树的结点结构包括权值,双亲,左右孩子: ...
- 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07
赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...
- java哈夫曼_用 JAVA 实现哈夫曼树(Huffman Tree)
-1. 什么是树 树是一种 有层次关系的 数据结构.它由结点组成. 图一: 树的结点由 数据域 和 子结点域 组成.数据域 作为数据的容器:子结点域 存放 子结点 的地址.一个结点是它的子结点的父结点 ...
- 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...
- 树的企业应用-哈夫曼编码树-有趣的数据压缩算法
树的企业应用-哈夫曼编码树-有趣的数据压缩算法 哈夫曼编码 描述 张三去李四家里,但 李四是一个女生,所以张三找李四去上海迪尼斯玩 - 亚历山大.张三去伊丽莎白.李四家里,但 伊丽莎白.李四是一个女生 ...
- 哈夫曼树的生成及哈夫曼编码
首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码. #include"stdio.h" #i ...
最新文章
- Repeater 嵌套 Repeater
- Latex学习笔记0
- 将win7电脑变身WiFi热点,让手机、笔记本共享上网
- 12月21日云栖精选夜读:阿里云总裁胡晓明:AI泡沫过后,下一站是“产业AI”...
- 2005年度国产空间信息系统软件测评工作圆满结束
- Python3提示 No module named ‘urlparse‘(解析url)
- 因非法扣押物资 华为向伟创力发律师函索赔数亿元
- 基于JAVA+SpringMVC+MYSQL的苗木销售系统
- 系统集成资质-信息系统项目管理师考试综合介绍
- viper4android使用时,ViPER4Android 目前进度 [11-21,13时16分]
- 2019年参加迅雷链宣讲会日记
- 投标文件模板 | 信息化智慧校园项目投标方案 | word版
- 网络视频流 -- ffmpeg 推流
- VDN互联网数据驱动 FOR PB
- 帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法
- 关于商业智能BI,今天只谈这五点
- Forecasting (一):introduction
- 逸鹏说道:读王阳明、曾国藩有所感
- linux启动mysql1820_linux下安装mysql的问题解决
- CSP CCF: 201903-2 二十四点 (C++)