1.算法说明
就是建造哈夫曼树树,从而使得构造出的树带权路径长度最小
2.步骤
输入叶子结点个数n;
创建长度为2*n-1的数组并初始化;
while(i<n) 循环输入n个叶子结点的权值;
while(n-1次循环建立树){
在parent==-1的元素中查找权最小的两个结点;
合并两个叶子结点,并加入新结点到数组;
}
3.代码
//构造haffman树
#include <iostream>
using namespace std;
const int MAX = 10000;
struct Node{
int weight; //权值
int parent; //双亲
int lchild;
int rchild;
};
//创建一个haffman树
void createHaffman(Node* &a, int n){
int m1,m2, x1, x2;//m1,m2是最小的两个值,x1,x2是他们的位置
//n个结点,只需要n-1次就可以构造好
for(int i=0; i<n-1; i++){
m1 = m2 = MAX;
x1 = x2 = 0;
//查找最小值,在查找到最小的两个值后,构造新的节点,并加入到a中(数组的n+i个节点之后),长度加1,故而查找过程中长度不断增加n+i
for(int j=0; j<n+i; j++){
//首先必须满足,还没有双亲的孤立节点,查找m1,m2都是最小
if(a[j].parent == -1 && a[j].weight < m1){
m1 = a[j].weight;
x1 = j;
}else if(a[j].parent == -1 && a[j].weight < m2){
m2 = a[j].weight;
x2 = j;
}
}
//新的节点存入n+i,并设置x1, x2的双亲
a[x1].parent = n+i;
a[x2].parent = n+i;
a[n+i].weight = a[x1].weight + a[x2].weight;
a[n+i].parent = -1;
a[n+i].lchild = x1;
a[n+i].rchild = x2;
}
}
//测试得到最小和次小的值
void test(){
int a[] = {3,4,7,0,79,9,12,1,4};
int m = MAX,k = MAX;
for(int i=0; i<9; i++){
if(a[i]<m){
m = a[i];
}else if(a[i]<k){
k = a[i];
}
}
cout<<m<<" "<<k<<endl;
}
int main(){
int n;
cout<<"输入叶子节点个数:";
cin>>n;
Node* a = new Node[2*n - 1];
for(int i=0; i<2*n-1; i++){//初始化
a[i].weight = 0;
a[i].parent = -1;
a[i].lchild = -1;
a[i].rchild = -1;
}
cout<<"输入前n个叶子结点的权值"<<endl;
for(int i=0; i<n; i++){
cin>>a[i].weight;
}
cout<<"输出构造好的haffman树"<<endl;
createHaffman(a, n);
for(int i=0; i<2*n-1; i++){
cout<<"["<<a[i].weight<<","<<a[i].parent<<","<<a[i].lchild<<","<<a[i].rchild<<"]"<<endl;
}
delete[] a;
return 0;
}
分享到:
相关推荐
### 构造哈夫曼树并生成编码 #### 哈夫曼树简介 哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,在数据压缩、编码等领域有广泛的应用。哈夫曼树的构建过程是通过将权值较小的两个节点...
首先,构造哈夫曼树的初始步骤是**构成初始集合**。给定一组权值,比如{(7, 9, 2, 6, 32, 3, 21, 10)},我们为每个权值创建一棵单节点二叉树,节点即为该权值,左右子树均为空。这些树按照权值的升序排列形成集合F,...
构建哈夫曼树的基本思想是利用给定的权值集合构造一棵二叉树,使得树中叶子节点的权值代表原始数据中的某个元素出现的频率,整棵树的带权路径长度(Weighted Path Length, WPL)最小。 按照题目描述,哈夫曼树的...
数据结构实验实现中序线索化二叉树构造哈夫曼树 本实验报告的主要内容是实现中序线索化二叉树构造哈夫曼树,通过实验实现了解二叉树的基本概念和哈夫曼树的构造过程。 一、实验背景 二叉树是数据结构中的一种重要...
"构造哈夫曼树并求哈夫曼编码的算法实现" 哈夫曼树是一种特殊的二叉树,它的每个叶子节点都对应着一个权值,哈夫曼编码是基于哈夫曼树的编码方式。哈夫曼树的构造和哈夫曼编码的实现是信息论和编程领域中的经典问题...
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
哈夫曼编码实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip实现哈夫曼编码,构造哈夫曼树C语言.zip
通过运行这个程序,我们可以观察到哈夫曼树的构造过程,并使用它对特定数据进行编码和解码,验证其正确性和效率。 哈夫曼树的特性使得它在数据压缩中具有优越性,因为频繁出现的元素会被赋予更短的编码,减少了总的...
构造哈夫曼树的过程通常分为以下几步: 1. **收集频率信息**:首先,统计每个字符在文本中出现的频率,这些频率就是叶子节点的权值。 2. **构建初始树**:将每个字符作为一个具有权值的叶子节点,用单节点的二叉树...
### 构造哈夫曼树C++代码实现 #### 哈夫曼树简介 哈夫曼树(Huffman Tree)又称最优二叉树,是一种带权路径长度最短的二叉树,或者说其带权路径长度是最小的。在数据压缩、编码等领域有着广泛的应用。哈夫曼树的...
哈夫曼树实现哈夫曼编码,构造哈夫曼树.zip
在C语言中实现哈夫曼编码和构造哈夫曼树涉及以下几个关键步骤: 1. **哈夫曼树的创建**: - 首先,我们需要一个数据结构来存储每个字符及其频率。这通常是一个结构体,包含字符和频率两个字段。 - 接着,创建一个...
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短...使用数组构建哈夫曼树,并可用该树构造哈夫曼编码。
`HuffmanTree`函数用于构造哈夫曼树,它首先初始化节点,然后输入各叶节点的权值,通过循环找到最小权值的节点进行合并,不断构建出哈夫曼树。`HaffmanCode`函数则负责生成哈夫曼编码,通过遍历哈夫曼树,记录每个...
构造哈夫曼树的算法模拟。数据结构有个重要的算法。共同学习
在详细设计部分,首先输入叶节点的权值,然后构造哈夫曼树,最后计算并输出每个叶节点的哈夫曼编码。 哈夫曼编码的应用广泛,例如在文本压缩中,可以显著减少数据的存储和传输需求。此外,它也被应用于错误检测和...
`HuffmanTree`函数用于构造哈夫曼树,它首先初始化了一个节点数组,然后输入各个节点的权重,并通过循环不断合并最小权重的节点。`HaffmanCode`函数负责生成哈夫曼编码,它遍历哈夫曼树,根据节点的位置(左孩子或右...
运行`C语言版本哈夫曼编码构造哈夫曼树`程序,你可以看到实际的压缩效果和哈夫曼树的结构。 总的来说,掌握哈夫曼编码的原理和C语言实现可以帮助你理解和应用数据压缩技术,特别是在处理大量文本数据时,能够有效地...
构造哈夫曼树过程.swf