64,646
社区成员
发帖
与我相关
我的任务
分享
template<class T>
class HufTreeNode
{
friend class HuffmanTree<T> ;
private:
T data;
HufTreeNode<T> *leftChild;
HufTreeNode<T> *rightChild;
};
template <class T>
class HuffmanTree
{
protected :
HufTreeNode<T> *root;
public:
HuffmanNode()
{
root = new HufTreeNode<T>;
}
HuffmanTree(HuffmanTree<T> &t1,HuffmanTree<T> &t2)
{
root = new HufTreeNode<T>;
root ->leftChild = t1.root;
root ->rightChild= t2.root;
root ->data=t1.root->data+t2.root->data;
} ;
HuffmanTree<T> *create(T *weight,int n);
int getMinWeight(HuffmanTree<T> **hNode,int num);
};
template<class T>
int HuffmanTree<T>::getMinWeight(HuffmanTree<T> **hNode,int num)//用两个**?
/*根据给定n个权值weight[]构造哈弗曼数。
每次从森林中找到权值最小的两棵树,设置一个大小为2n+1的数组hNode,其元素类型是指向哈弗曼树的指针。
初始时存放的是由n个权值构造的只有根节点的n棵树的指针,当某棵树的根结点已经被选作最小权值的根后,
数组中对应元素值置为空,避免后续操作又选到这棵树。*/
{
T minweight;
minweight=MAXWEIGHT;
int k=-1;
for (int j=0;j<num;j++)//num 是数组元素个数+1
if(hNode[j]!= NULL&& hNode[j]->root->data<minweight)
{
minweight=hNode[j]->root->data;
k=j;
}
return k;
}
template<class T>
HuffmanTree<T>::create(T *weight,int n)
{
HuffmanTree<T> **hNode,*t1,*t2,*t;
hNode=new HuffmanTree<T> *[2*n+1];
int curnum=n;
HuffmanTree<T> *leaf=new HuffmanTree<T> [n];
for(int i=0;i<n;i++)
{
leaf[i].root->data=weight[i];
leaf[i].root->leftChild=NULL;
leaf[i].root->rightChild=NULL;
hNode[i]=&(leaf[i]);
}
for (i=0;i<n-1;i++)
{
int k=getMinWeight(hNode,curnum);
if(k!=-1)
{t1=hNode[k];hNode[k]=NULL;}
k=getMinWeight(hNode,curnum);
if(k!=-1)
{t2=hNode[k];hNode[k]=NULL;}
HuffmanTree<T> *newTree=new HuffmanTree<T>(*t1,*t2);
hNode[curnum++]=newTree;
t=newTree;
}
return t;
}