//函数:构造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. [Inside HotSpot] C1编译器HIR的构造

    1. 简介 这篇文章可以说是Christian Wimmer硕士论文Linear Scan Register Allocation for the Java HotSpot™ Client Compi ...

  2. 金三银四,今年Python就业前,看看这篇文章找找感觉

    Python就业行情和前景分析之一爬取数据 最近Python大热,就想要分析一下相关的市场需求,看一下Python到底集中在哪些城市,企业对Python工程师的一些需求到底是怎样的,基于此,爬取了国内 ...

  3. 我不是bug神(JVM问题排查)

    Story background 回望2018年12月,这也许是程序员们日夜不得安宁的日子,皆因各种前线的系统使用者都需要冲业绩等原因,往往在这个时候会向系统同时写入海量的数据,当我们的应用或者数据库 ...

  4. 这年头做开源项目,被冷嘲热讽,FreeSql 0.0.4

    FreeSql 项目大概在20天前想着要做的,今天发布0.0.4在群里被一位大神讽刺. 这位无名氏哥们的观点,先声明这不是找安慰的文章,更加不是报复打击的目的. 1 所以这个比EF好在哪里 2 毕竟E ...

  5. 强化学习(十五) A3C

    在强化学习(十四) Actor-Critic中,我们讨论了Actor-Critic的算法流程,但是由于普通的Actor-Critic算法难以收敛,需要一些其他的优化.而Asynchronous Adv ...

  6. Java面试前需要了解的东西

    一.前言 只有光头才能变强 回顾前面: 广州三本找Java实习经历 上一篇写了自己面试的经历和一些在面试的时候遇到的题目(笔试题和面试题). 我在面试前针对Java基础也花了不少的时间,期间也将自己写 ...

  7. windows下,提权代码.

    #include <windows.h> bool AdjustPrivileges() { HANDLE hToken = NULL; TOKEN_PRIVILEGES tp; TOKE ...

  8. Asp.Net Core Web应用程序—探索

    前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准( ...

  9. java基础(八)-----深入解析java四种访问权限

    Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. 一.访问权限简介 访问权限控制: 指的是本类 ...

  10. Android 项目中用得最多最火的第三方框架可能都在这里了

    分类 二级分类 框架名称 简介 Star 数 最近更新 UI 刷新 SmartRefreshLayout 智能下拉刷新框架 14k 18天 UI 刷新 Android-PullToRefresh 比较 ...