//函数:构造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. Vue学习小结(二)

    接上一批,小结(二). 三.导航内容(含左侧导航及顶部面包屑导航) 其实导航条主要根据element-ui的教程进行编写,官网:http://element-ui.cn/#/zh-CN/compone ...

  2. 3D数学 矩阵常用知识点整理

    1.矩阵了解 1)矩阵的维度和记法 (先数多少行,再数多少列) 2)矩阵的转置 行变成列,第一行变成第一列...矩阵的转置的转置就是原矩阵            即        3)矩阵和标量的乘法 ...

  3. java程序调用CMD命令启动tomcat替换环境变量

    出现问题: 此时不应有 Files\Java\jdk1.8.0_92\bin\java.exe""(本地未出现问题,服务器环境出现) 出现原因: 1:环境变量JAVA_HOME配置 ...

  4. HTML5将footer置于页面最底部的方法(CSS+JS)

    JavaScript: <script type="text/javascript"> $(function(){ function footerPosition(){ ...

  5. 微信小程序计算器Bug版=-=(笔记)

    微信小程序计算器BUG版本 无APPID的测试号登录,先在app.json中更改路径,以及修改头部信息. 首先一个输入框字段用{{screenData}} 功能可以退格,清屏,正负号,正常操作加减乘除 ...

  6. geoserver发布mysql表数据

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.环境部署 Geoserver中并不自带mysql数据发布功能,需要下 ...

  7. Git使用详细教程(9):git log

    目录 格式化 检索 显示最近提交 Git中使用git log查看提交日志 如果日志很多的话,默认会以分页方式展示 空格可以翻下一页,ctrl+b翻上一页,q退出 格式化 如果想获取每条日志的简要信息, ...

  8. python3 集合 操作方法

    今天都是课, 就学这么点  不多说 睡觉睡觉!!! #!usr/bin/env/ python # -*- coding:utf-8 -*- # Author:XiaoFeng list = [1,2 ...

  9. 详解IPTABLES

    详解IPTABLES Iptables 是Linux 内核集成的 IP 信息包过滤系统.如果Linux 系统连接到因特网或 LAN.服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Li ...

  10. 如何在ASP.NET Core中使用JSON Patch

    原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...