样例输入:叶子结点 n = 8 ;叶子结点权值 w = {5,29,7,8,14,23,3,11};
样例输出:见文末哈夫曼结构数组。
代码:
//哈夫曼树构造过程实现
#include <iostream>
using namespace std;
//哈夫曼树采用顺序存储的方式更方便-一维结构数组
typedef struct {
int weight;
int parent,lChild,rChild;
}HTNode,*HuffmanTree; //结构数组数据元素定义
//从排列中选择最小和次小的两个元素
void Select(HuffmanTree HT,int m,int *s1,int *s2){
int i;//从下标为1的位置开始计数
//int min=HT[1].weight;这里直接赋值不合理,假如第一次那个1就是最小被选选中,那么第2次还是被选中
int min1=1000;
int min2=1000;//规定一个特别大的数
for(i=1;i<=m;i++){
if(HT[i].parent==0&&min1>HT[i].weight){
min1=HT[i].weight;
*s1=i;
}
}
for(i=1;i<=m;i++){//注意这个I!=*s1标记min
if(i!=(*s1)&&HT[i].parent==0)
if(HT[i].weight<min2){
min2=HT[i].weight;
*s2=i;
}
}
}
//哈夫曼算法:构造哈夫曼树的算法
void CreateHuffmanTree(HuffmanTree &HT,int n) { //叶子结点个数
//哈夫曼树初态
if (n <= 1) return;
int m = 2*n-1;//哈夫曼树结点总数,用来确定结构数组的大小
HT = new HTNode[m+1];//结构数组申请存储空间,可以存放2n个数据元素
for (int i = 1; i <= m; ++i) {//初始化数据元素的成员均为0
HT[i].lChild = 0;
HT[i].rChild = 0;
HT[i].parent = 0;
}
for (int i = 1; i <= n; ++i) {//为前1-n个元素的权赋值,即存储叶子结点的权值
cout << "请输入叶子结点" << i << "号的权值" << endl;
cin >> HT[i].weight;
}
//哈夫曼树终态
int s1,s2;
for (int i = n+1; i <= m; ++i) {//合并产生n-1个结点
Select(HT,i-1,&s1,&s2);//在HT[k](1<k<=i-1)中选择两个其双亲域为0.且权值最小的结点,
//并返回它们在HT中的序号s1和s2
HT[s1].parent = i;//从森林从删除s1和s2
HT[s2].parent = i;
HT[i].lChild = s1;//s1和s2分别作为新生成结点的左右孩子
HT[i].rChild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;//新生成结点的权值为其左右孩子的权值之和
}
}
void outHuffmanTree(HuffmanTree HT,int n){
if(HT==NULL)
cout << "哈夫曼树为空" << endl;
int i;
cout << "输出huffmanTree表格" << endl;
cout << "结点 weight parent lChild rChild" << endl;
for(i=1;i<2*n;i++){
cout << i << " " << HT[i].weight << " " << HT[i].parent << " "
<< HT[i].lChild << " " << HT[i].rChild << endl;
}
}
int main(){
int n;
HuffmanTree HT;
cout << "下面进行哈夫曼树的创建,请输入哈夫曼树叶子结点个数:" << endl;
cin >> n;
CreateHuffmanTree(HT,n);
cout << "创建Huffman tree完成" << endl;
outHuffmanTree(HT,n);
return 0;
}
运行结果:
下面进行哈夫曼树的创建,请输入哈夫曼树叶子结点个数:
8
请输入叶子结点1号的权值
5
请输入叶子结点2号的权值
29
请输入叶子结点3号的权值
7
请输入叶子结点4号的权值
8
请输入叶子结点5号的权值
14
请输入叶子结点6号的权值
23
请输入叶子结点7号的权值
3
请输入叶子结点8号的权值
11
创建Huffman tree完成
输出huffmanTree表格
结点 weight parent lChild rChild
1 5 9 0 0
2 29 14 0 0
3 7 10 0 0
4 8 10 0 0
5 14 12 0 0
6 23 13 0 0
7 3 9 0 0
8 11 11 0 0
9 8 11 7 1
10 15 12 3 4
11 19 13 9 8
12 29 14 5 10
13 42 15 11 6
14 58 15 2 12
15 100 0 13 14
进程已结束,退出代码0