最近几天,一直在看数据结构的赫夫曼树部分。看了书上的伪码,又看了他人所写的源代码,总感觉思路不够清晰,就自己尝试写了一下编码的建树部分(几乎在抛弃原有思路的基础上)。写完后,审视自己的代码,与书上的结构就不一样。虽然实现了相同的功能,但从变量声明,函数参数传递,以及main函数构造等方面总感觉别扭。比如,我声明的函数竟然都没有用到参数传递,而是使用了几个全局变量。老师讲过,全局变量会让函数变的不安全,独立性差,能不用尽量别用。可我觉得用的挺顺手,应该是处理的不好吧。还有main()函数部分,是不是太过于简单了呢? 问题很多,希望与大家交流,多学习,改进自己的不足。
//构造赫夫曼树的程序
#include<iostream>
using namespace std;
const int MAX_Weight=100;//定义最大权值
int n,m; //全局量,赫夫曼树的叶结点数和结点总数
int *w; //全局量,与结点对应的权值数组,为实现操作而设
struct HTNode //结点结构(因在此处结点信息无用,故不设结点信息)
{
int weight; //权
int parent,lchild,rchild; //父亲和左、右孩子
};
typedef HTNode * HuffmanTree; //定义新类型 HuffmanTree
HuffmanTree HT; //全局量
//输入函数,完成赫夫曼树中所有结点的初始化
void Import()
{
int a,i; //a,权值输入值;i,for循环控制量;
cout<<"请输入叶子结点数:";
cin>>n;
cout<<endl;
m=2*n-1; //结点总数
w=(int *)malloc(m*sizeof(int));
HT=(HTNode *)malloc(m*sizeof(HTNode));
for(i=0;i<n;++i) //叶结点的初始化
{
cout<<"请输入第"<<i<<"个叶子结点的权值:";
cin>>a;
cout<<endl;
HT[i].weight=a;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
w[i]=a; //权值数组的赋值
}
for(i=n;i<m;++i) //非终端结点的初始化
{
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
w[i]=MAX_Weight;
}
cout<<endl;
cout<<"赫夫曼树中全部结点的初始信息是:"<<endl;
cout<<endl;
cout<<"权值"<<" "<<"父亲"<<" "<<"左孩子"<<" "<<"右孩子"<<endl;
for(i=0;i<m;++i)
{
cout<<HT[i].weight<<" "<<HT[i].parent<<" "<<HT[i].lchild<<" "<<HT[i].rchild;
cout<<endl;
}
}
//建树函数,构建赫夫曼树
void HuffmanTreeMy()
{
int min1,min2; //最小权值量
int i,j; //for循环控制量
int m1,m2; //权最小结点的结点号
for(j=n;j<m;++j)//最外层循环
{
min1=MAX_Weight;
for(i=0;i<m;++i) //求取最小权值结点
{
if(min1>w[i])
{
min1=w[i];
m1=i;
}
}
w[m1]=MAX_Weight;
min2=MAX_Weight; //求取次小权值结点
for(i=0;i<m;++i)
{
if(min2>w[i])
{
min2=w[i];
m2=i;
}
}
w[m2]=MAX_Weight;
HT[j].lchild=m1; //建树的操作
HT[j].rchild=m2;
HT[j].weight=min1+min2;
w[j]=HT[j].weight;
HT[m1].parent=j;
HT[m2].parent=j;
}
}
//功能函数,输出显示赫夫曼树的信息
void Export()
{
cout<<endl;
cout<<"赫夫曼树的最终信息为:"<<endl;
cout<<endl;
cout<<"权值"<<" "<<"父亲"<<" "<<"左孩子"<<" "<<"右孩子"<<endl;
for(int a=0;a<m;++a)
{
cout<<HT[a].weight<<" "<<HT[a].parent<<" "<<HT[a].lchild<<" "<<HT[a].rchild;
cout<<endl;
}
}
void main()
{
Import();
HuffmanTreeMy();
Export();
}
本文介绍了一种构建赫夫曼树的方法,通过自定义的编码实现了赫夫曼树的建立过程,并展示了完整的初始化、构建及输出流程。
1268

被折叠的 条评论
为什么被折叠?



