//函数:构造Huffman树HT[2*n-1]
#define MAXVALUE 9999//假设权值不超过9999
#define MAXLEAF 30
#define MAXNODE MAXLEAF*2-1
using namespace std;
#include <iostream> //Using cin or cout
#include <malloc.h> //Using malloc and realloc
#include <stdio.h> //Using c
#include <stdlib.h> typedef struct
{
int weight;//权值
int parent;//父结点下标
int lchild;//左孩子下标
int rchild;//右孩子下标
}HTNode; void HuffmanTree(HTNode HT[], int n)
{
int i,j,x1,x2;
int m1,m2;
for(i=1;i<=n-1;++i)//n-1个非叶子结点
{
m1=m2=MAXVALUE; x1=x2=0; //m1,m2用来记录结点中最小的权值,x1,x2用来记录其左右子树结点
for(j=1;j<n+i;++j)
{ if(HT[j].parent==0)
{ if (HT[j].weight<m1) {m2=m1; x2=x1;m1=HT[j].weight; x1=j;}
else if(HT[j].weight<m2) { m2=HT[j].weight; x2=j;}
}
}
HT[x1].parent=n+i;
HT[x2].parent=n+i;
HT[n+i].weight = HT[x1].weight + HT[x2].weight;
HT[n+i].lchild=x1;
HT[n+i].rchild=x2;
}//外层for循环结束 }
//函数:求Huffman树HT[n]的Huffman编码
#define MAXBIT 20
typedef struct
{
int bit[MAXBIT];
int start;
}HCodeType; void HuffmanCode (HTNode HT[], int n, HCodeType HuffCode[])
{
HCodeType cd; int i,j,c,p;
for(i=1;i<=n;++i)
{
cd.start=n; c=i; p=HT[c].parent;//p为c双亲
while(p!=0)
{
if(HT[p].lchild==c) cd.bit[cd.start]=0;
else cd.bit[cd.start]=1;
cd.start--; c=p; p=HT[c].parent ;//保持p为c双亲
}
for(j=cd.start+1;j<=n;j++) HuffCode[i].bit[j]=cd.bit[j];
HuffCode[i].start=cd.start;
}
for(i=1;i<=n;++i)
{
cout<<"第"<<i<<"个字符的哈夫曼编码为:";
for(int j=HuffCode[i].start+1;j<=n;j++)
{ cout<<HuffCode[i].bit[j];
//printf("%d",HuffCode[i].bit[j]);
}
cout<<endl;
}
}
int main()
{
int n=8;
HTNode HT[MAXNODE];
for(int i=1; i<=2*n-1; ++i) //初始化
{
HT[i].weight=0; HT[i].parent=0;
HT[i].lchild=0; HT[i].rchild=0;
}
for(int i=1;i<=n;++i)
{
cout<<"请输入第"<<i<<"个值为:"<<endl;
scanf("%d",&HT[i].weight);
if(HT[i].weight>=MAXVALUE)
{
printf("超过权值允许的最大值,重新输入!\n");
--i;
}
}
HuffmanTree(HT,n);
HCodeType HuffCode[MAXNODE];
HuffmanCode (HT,n,HuffCode);
}

  

Huffman Tree 简单构造的更多相关文章

  1. 用优先队列构造Huffman Tree及判断是否为最优编码的应用

    前言 我们知道,要构造Huffman Tree,每次都要从堆中弹出最小的两个权重的节点,然后把这两个权重的值相加存放到新的节点中,同时让这两个节点分别成为新节点的左右儿子,再把新节点插入到堆中.假设节 ...

  2. 51nod1117(简单huffman tree)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1117 题意:中文题诶- 思路:简单huffman tree ...

  3. Huffman Tree

    哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...

  4. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  5. 哈夫曼树(Huffman Tree)与哈夫曼编码

    哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)

  6. 数据结构实习 problem O Huffman Tree

    Huffman Tree 题目描述 对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码. 输入 大写字母个数 n 第一个字母 第二个字母 第三个字母 .. ...

  7. Huffman coding & Huffman tree

    Huffman coding & Huffman tree Huffman coding 哈夫曼编码 / 最优二元前缀码 Huffman tree 哈夫曼树 / 最优二叉树 https://w ...

  8. Huffman树的构造及编码与译码的实现

    哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...

  9. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

随机推荐

  1. 循环神经网络之LSTM和GRU

    看了一些LSTM的博客,都推荐看colah写的博客<Understanding LSTM Networks> 来学习LSTM,我也找来看了,写得还是比较好懂的,它把LSTM的工作流程从输入 ...

  2. com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 报错问题

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known serve ...

  3. DataFrameNaFunctions无fill方法

    当我使用 spark2.1 ,为了填补 dataframe 里面的 null 值转换为 0 ,代码如下所示: dataframe.na.fill(0) 出现如下错误 Spark version 2.1 ...

  4. 只有一百行的xss扫描工具——DSXS源码分析

    目录 0x00 废话 0x01 扫描逻辑 第一个逻辑:dom型xss 第二个逻辑:经过后端的xss 0x02 总结 0x00 废话 DSXS是一个只有一百行代码的xss扫描器,其作者刚好就是写sqlm ...

  5. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  6. 玩转Spring Cloud之服务注册发现(eureka)及负载均衡消费(ribbon、feign)

    如果说用Spring Boot+Spring MVC是开发单体应用(或单体服务)的利器,那么Spring Boot+Spring MVC+Spring Cloud将是开发分布式应用(快速构建微服务)的 ...

  7. Linux 系统调用过程详细分析

    内核版本:Linux-4.19 操作系统通过系统调用为运行于其上的进程提供服务. 那么,在应用程序内,调用一个系统调用的流程是怎样的呢? 我们以一个假设的系统调用 xyz() 为例,介绍一次系统调用的 ...

  8. 一起学Android之Menu

    概述 菜单(Menu)在Android开发中,是一种常见的用户界面组件,通过使用菜单Api可以给用户提供常见的一致的体验.本文主要讲解三种菜单的相关内容. 菜单的分类 选项菜单(OptionsMenu ...

  9. 学习ELK之----01.建立ELK测试项目

    1. 建立一个4G内存的虚拟机,安装Linux系统(具体的版本以能运行Docker为准,我用的是Ubuntu-Server) 2. 安装Docker 3. 下载elk容器:# docker pull ...

  10. Java关于读取Excel文件~xlsx xls csv txt 格式文件~持续汇总~

    所需的jar百度网盘链接:https://pan.baidu.com/s/146mrCImkZVvi1CJ5KoiEhQ提取码:c329 1 需要导入jar包,缺1不可 dom4j-1.6.1.jar ...