我的构建赫夫曼树代码

本文介绍了一种构建赫夫曼树的方法,通过自定义的编码实现了赫夫曼树的建立过程,并展示了完整的初始化、构建及输出流程。

       最近几天,一直在看数据结构的赫夫曼树部分。看了书上的伪码,又看了他人所写的源代码,总感觉思路不够清晰,就自己尝试写了一下编码的建树部分(几乎在抛弃原有思路的基础上)。写完后,审视自己的代码,与书上的结构就不一样。虽然实现了相同的功能,但从变量声明,函数参数传递,以及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();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值