哈夫曼树
抒与台 2019-04-16 11:37:11 哈夫曼树
#include<iostream>
using namespace std;
const int MAX=20;
//哈夫曼树输入数据的结构
struct huffinit
{
char data;
int weight;
};
//哈夫曼树结点的结构
struct huffnode
{
int weight;
int lchild,rchild,parent;
};
//哈夫曼树类的声明
class HuffTree
{
public:
HuffTree(huffinit w[],int n)
{
int min1,min2;
size=n;
for(int i=0;i<n;i++)
tree[i].weight=w[i].weight;
for(i=0;i<2*n-1;i++)
{
tree[i].parent=-1;
tree[i].lchild=-1;
tree[i].rchild=-1;
}
for(i=n;i<2*n-1;i++)
{
Select(min1,min2,i);
// cout<<min1<<min2<<endl;
tree[min1].parent=i;
tree[min2].parent=i;
tree[i].weight=tree[min1].weight+tree[min2].weight;
tree[i].lchild=min1;
tree[i].rchild=min2;
}
}
//~HuffTree() { }
void Select(int &min1,int &min2,int m)
{
int mm1,mm2,i;
mm2=mm1=999999;
for(i=0;i<m;i++)
{
if(tree[i].parent==-1)
{
if(mm1>tree[i].weight)
{
mm1=tree[i].weight;
min1=i;
}
}
}
// cout<<mm1<<endl;
for(i=0;i<m;i++)
{
if(tree[i].parent==-1)
{
if(mm2>tree[i].weight&&i!=min1)
{
mm2=tree[i].weight;
min2=i;
}
}
}
// cout<<mm2<<endl;
}
void show()
{
for(int i=0;i<2*size-1;i++)
{
printf("%d,%d,%d,%d\n",tree[i].weight,tree[i].parent,tree[i].lchild,tree[i].rchild);
}
}
private:
huffnode tree[2*MAX-1];
int size;
};
int main()
{
int n;
huffinit a[20];
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i].data>>a[i].weight;
HuffTree t(a,n);
t.show();
cout<<endl;
}
return 0;
}