#include <iostream>
#include <string.h>
#include <fstream>
#define LEAFNUM 26 //叶子节点数,也就是权值树
#define HUFNUM 2*LEAFNUM
#define MAXWEIGHT 10000
using namespace std;
//*********存储结构***********
//***** Node**********
class NODE
{
private:
char Data; //节点的数据域
double Weight; //节点的权值域
int Lchild,Rchild,Parent; //节点的左孩子右孩子及双亲域
public:
NODE() //构造函数
{
Data = '\0';
Weight = 0;
Lchild = -1;
Rchild = -1;
Parent = -1; //给节点的数据初始化
}
int Return_L(){return Lchild;}
int Return_R(){return Rchild;}
char Return_Data(){return Data;}
double Re_Weight(){return Weight;}
friend class HufTree; //声明友元
};//Node
//********HufTree类**********
class HufTree
{
private:
int NodeNum;
NODE HufArry[HUFNUM];
public:
HufTree(){NodeNum = 52;}
void SetHuf(int,double,char);
void CreatHuf(HufTree&);
/*void startcode(char *,int );*/
void Select(int,int&,int&,HufTree &);
void sethuf(HufTree &) ;
};
void HufTree::CreatHuf(HufTree &Tree)
{
cout<<"每次查询两个最小树的位置:"<<endl;
for(int i = LEAFNUM+1; i < HUFNUM; i++)
{ NodeNum=i;
int p1 = 0;
int p2 = 0;
Select(i,p1,p2,Tree); //找出当前树种权值最小的两颗树
cout<<p1<<" < - > "<<p2<<endl; /*"&&&"*/
HufArry[p1].Parent = i; //设置两颗最小树的双亲
HufArry[p2].Parent = i;
HufArry[i].Lchild = p1; //设置这棵3节点的树的根的权值以及孩子
HufArry[i].Rchild = p2;
HufArry[i].Weight = HufArry[p1].Weight + HufArry[p2].Weight;
}
cout<<"************************"<<endl;
for(int s=1;s<=26;s++ ) //看这里看这里,此循环用来检验 HufArry[i].Lchild等的值是否改变,问题就在这儿
cout<<HufArry[s].Lchild<<HufArry[s].Rchild<<"***********"<<endl;
}
void HufTree::Select(int i,int &p1,int &p2,HufTree &Tree)
{
int least1 = MAXWEIGHT;
int least2 = MAXWEIGHT;
for(int j = 1; j < i; j++)
{
if(HufArry[j].Parent == -1) //删除树
{
if(HufArry[j].Weight < least1)
{
least2 = least1;
least1 = HufArry[j].Weight;
p2 = p1;
p1 = j;
}
else
{
if(HufArry[j].Weight < least2)
{
least2 = HufArry[j].Weight;
p2 = j;
}
}
}
}
}
void HufTree::sethuf(HufTree &Tree)
{
Tree.SetHuf(1,8.19,'a');
Tree.SetHuf(2,1.47,'b');
Tree.SetHuf(3,3.83,'c');
Tree.SetHuf(4,3.91,'d');
Tree.SetHuf(5,12.25,'e');
Tree.SetHuf(6,2.26,'f');
Tree.SetHuf(7,1.71,'g');
Tree.SetHuf(8,4.57,'h');
Tree.SetHuf(9,7.10,'i');
Tree.SetHuf(10,0.14,'j');
Tree.SetHuf(11,0.41,'k');
Tree.SetHuf(12,3.77,'l');
Tree.SetHuf(13,3.34,'m');
Tree.SetHuf(14,7.06,'n');
Tree.SetHuf(15,7.26,'o');
Tree.SetHuf(16,2.89,'p');
Tree.SetHuf(17,0.09,'q');
Tree.SetHuf(18,6.85,'r');
Tree.SetHuf(19,6.36,'s');
Tree.SetHuf(20,9.41,'t');
Tree.SetHuf(21,2.58,'u');
Tree.SetHuf(22,1.09,'v');
Tree.SetHuf(23,1.59,'w');
Tree.SetHuf(24,0.21,'x');
Tree.SetHuf(25,1.58,'y');
Tree.SetHuf(26,0.08,'z');
}
void HufTree::SetHuf(int i,double wei,char ch)
{
HufArry[i].Data = ch;
HufArry[i].Weight = wei;
}
int main(int agrc,char** agrv)
{
HufTree Tree;
Tree.sethuf(Tree);
Tree.CreatHuf(Tree); //创建哈夫曼树
return 0;
}