Huffman Tree

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

哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

#include<iostream>
#include<iomanip>
using namespace std;
const int n=5; //maxn表示叶子数目
const int m=2*n-1; //m为森林中树的数
const int maxValue=3555; //最大权值
struct TreeNode //哈夫曼树中的一个结点
{ float weight; //权值
int parent; //双亲
int lchild,rchild; //左孩子、右孩子
};

struct hacode //哈弗曼编码
{ int bits[n+1]; //哈弗曼编码
int start; //编码的存放位置
char ch; //所对应的字符
};

TreeNode haffTreeNode[m+1];
hacode code[n+1];

void CreatHaffTreeNode() //建立哈夫曼树
{
int i,j,p1,p2; float s1,s2;
for(i=1;i<=2*n-1;i++)
{
haffTreeNode[i].parent=0;
haffTreeNode[i].lchild=0;
haffTreeNode[i].rchild=0;
haffTreeNode[i].weight=0;
}
cout<<"请输入"<<n<<"个权值"<<endl;
for(i=1;i<=n;i++)
cin>>haffTreeNode[i].weight; //输入权值
for(i=n+1;i<=2*n-1;i++) //进行N-1次合并,n-1个非叶子节点
{ p1=p2=0;    //p1,p2分别指向两个权值最小的值的位置
s1=s2=maxValue; //s1,s2代表两个最小权值
for(j=1;j<=i-1;j++){ //选两个最小值
if(haffTreeNode[j].parent==0) //该权值还没有选中
if(haffTreeNode[j].weight<s1)
{
s2=s1;
s1=haffTreeNode[j].weight;
p2=p1;
p1=j;
}
else if(haffTreeNode[j].weight<s2)
{
s2=haffTreeNode[j].weight;
p2=j;
}
}//以下为合并
haffTreeNode[p1].parent=i;
haffTreeNode[p2].parent=i;
haffTreeNode[i].lchild=p1;
haffTreeNode[i].rchild=p2;
haffTreeNode[i].weight=haffTreeNode[p1].weight+haffTreeNode[p2].weight;
}
}
void HuffCode() //哈弗曼编码
{
hacode cd;
int c,p;
for(int i=1;i<=n;i++)
{
cd.start=n+1;
cd.ch=96+i; //第一个树叶对应字母a,其余依此类推
c=i;
p=haffTreeNode[i].parent;
while(p!=0)
{
cd.start--;
if(haffTreeNode[p].lchild==c)
cd.bits[cd.start]=0;
else
cd.bits[cd.start]=1;
c=p;
p=haffTreeNode[p].parent;
}
code[i]=cd;
}
for(int i=1;i<=n;i++)
{

cout<<"字符"<<code[i].ch<<"的权值为:"<<haffTreeNode[i].weight<<setw(5)<<"\t编码为:";
for(int j=code[i].start;j<=n;j++)
cout<<code[i].bits[j]<<" ";
cout<<endl;
}
}
void TransCode() //哈弗曼译码
{
int i=m;
char b;
cout<<"请输入二进制编码串(以非0,1结束)"<<endl;
cin>>b;
while((b==‘0‘)||(b==‘1‘))
{
if(b==‘0‘)
i=haffTreeNode[i].lchild;
else
i=haffTreeNode[i].rchild;
if(haffTreeNode[i].lchild==0)
{
cout<<code[i].ch;
i=m;
}
cin>>b;
}
}
void main()
{
CreatHaffTreeNode(); //建立哈夫曼树
HuffCode(); //实现哈弗曼编码
TransCode(); //进行哈弗曼译码
cout<<endl;
system("pause");
}
时间: 2024-12-05 03:58:51

Huffman Tree的相关文章

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)

flyfish 2015-8-1 Huffman tree因为翻译不同所以有其他的名字 赫夫曼树.霍夫曼树.哈夫曼树 定义引用自严蔚敏<数据结构> 路径 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径. 路径长度 路径上的分支数目称作路径长度. 树的路径长度 树的路径长度就是从根节点到每一结点的路径长度之和. 结点的带权路径长度 结点的带权路径长度就是从该结点到根节点之间的路径长度与结点上权的乘积. 树的带权路径长度 树的带权路径长度就是树中所有叶子结点的带权路径长度之和,通常记做

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

今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程.. 首先,我先假设你已经有了二叉树的相关知识,主要就是概念和遍历方式这些点.如果没有这些知识储备,可能理解起来会比较困难. 好了,废话不多说. 哈夫曼树原理 秉着能不写就不写的理念,关于哈夫曼树的原理及其构建,还是贴一篇博客吧. http://www.cnblogs.com/mcgrady/p/3

Huffman Tree -- Huffman编码

#include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct HuffmanTree { int weight; int parent, lchild, rchild; }HuffmanTree; typedef struct CodeNode { int ch; char bits[4+1]; }CodeNode; void SelectMin(HuffmanTree tree[],

树-哈夫曼树(Huffman Tree)

概述 哈夫曼树:树的带权路径长度达到最小. 构造规则 1. 将w1.w2.-,wn看成是有n 棵树的森林(每棵树仅有一个结点): 2. 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左.右子树,且新树的根结点权值为其左.右子树根结点权值之和: 3. 从森林中删除选取的两棵树,并将新树加入森林: 4. 重复(02).(03)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树. 基本操作 定义 1 权值 2 左孩子 3 右孩子 4 父节点 构造哈夫曼树(使用最小堆) 1 构造最小堆

温故而知新, 哈夫曼树(Huffman tree)

哈夫曼树定义:在一棵二叉树中,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树. 如何构建哈夫曼树: 一般可以按如下步骤构建: 假设有n个权值W1,W2,...,Wn,将这些权值看成是有n棵树的森林(每棵树仅有一个节点), 则哈夫曼树的构造规则为: 1,在森林中选出2个根节点的权值最小的树合并为一棵新树,作为左右子树,且新树的根节点权值为其左右子树根节点权值之和. 2,从森林中删除这两棵树,同时把新树加入到森林中. 3,重复1,2步骤,直到森林中只有一棵树为止,此树就是哈夫曼树.

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres

huffman编码【代码】

哈夫曼编码应该算数据结构"树"这一章最重要的一个问题了,当时大一下学期学的时候没弄懂,一年后现在算是明白了. 首先,讲讲思路. 正好这学期在学算法,这里面就用到了贪心算法,刚好练练手. 整个问题有几个关键点: 1,首先是要思考怎么样存下从txt中读取的一个所有字符中每种字符出现的次数,首先想到的应该是结构体数组,再仔细想想不对呀,时间复杂度太高了,每次判断一个字符都对知道它属于结构体数组中的哪一个,那要是txt中有很多字符,那光这个就得花好多时间.然后想想,如果读取的字符如果只有那25

huffman编码压缩和解压

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> typedef struct huffman_node_tag { unsigned char isLeaf; unsigned long count; struct huffman_node_tag *parent; union { struct {

Huffman编码——Java实现

Huffman编码 是一种编码方式,常用于无损压缩.本文只介绍用Java语言来实现该编码方式的算法和数据结构. Huffman编码的核心在于构建一颗最优化的二叉树,首先要得到一个原数据编码中的[编码:频率]的列表,然后根据列表构建二叉树,最后对二叉树编码. 第一步: 计算出每个词(编码)出现的频次,并输出到一个列表 例如字符串:"this is an example of a huffman tree", 它的二进制编码是11101001101000110100111100111000