数据结构之哈夫曼树

一.哈夫曼树的描述:

   

 一般来说,用n(n>0)个带权值的叶子来构造二叉树,限定二叉树中除了这n个叶子外只能出现度为2的结点。那么符合这样条件的二叉树往往可构造出许多棵,其中带权路径长度最小的二叉树就称为哈夫曼树最优二叉树

 

二.哈夫曼树的构造

 

树的带权路径长度:如果树中每个叶子上都带有一个权值,则把树中所有叶子的带权路径长度之和称为树的带权路径长度。

 

某二叉树有n个带权值的叶子结点,则该二叉树的带权路径长度记为:

数据结构之哈夫曼树_第1张图片

Wk为第k个叶子结点的权值;Lk为该结点的路径长度。

 

数据结构之哈夫曼树_第2张图片

 

其基本思想如下:

 

数据结构之哈夫曼树_第3张图片

数据结构之哈夫曼树_第4张图片

 

三,代码实现哈夫曼树

实现一个哈夫曼编码系统,系统包括以下功能:

(1) 信息输入

(2) 建立哈夫曼树:根据统计结果建立哈夫曼树,输出构建过程。

(3) 建立哈夫曼码表:利用得到的哈夫曼树,将各字符对应的编码表输出。

(4)输出带权路径长度WPL。

 

代码实现如下:

#include
using namespace std;

typedef char **HuffmanCode;
#define INF 0x3f3f3f3f

int s1,s2;							//weight最小的两个结点记为s1和s2 
int a[100];							//存放每个叶子结点哈夫曼编码的长度 

typedef struct{
	int weight;						//用来存储各个结点的权值 
	int parent,lchild,rchild;		//指向双亲、孩子结点的指针 
}HTNode,*HuffmanTree;				//存储哈夫曼树 

//选择两个parent为0,且weight最小的结点s1和s2 
void Select(HuffmanTree HT,int n){
	int min1=INF,min2=INF;
	for(int i=1;i<=n;i++){
		if(HT[i].parent)	continue;
		if(HT[i].weight

 

你可能感兴趣的:(数据结构篇)