#include
#include
#define N 50 //叶子结点数
#define M 2*N-1 //树中结点总数
#include
using namespace std;
typedef struct
{
char data[5];//结点值
int weight; //权重
int parent; //双亲结点
int lchild; //左孩子结点
int rchild; //右孩子节点
}HTNode;
typedef struct
{
char cd[N]; //存放哈夫曼编码
int start; //ch[start..n]存放哈夫曼编码
}HCode;
void CreateHT(HTNode ht[],int n) //由ht的叶子结点构造完整的哈夫曼编码
{
int i,k,lnode,rnode;
int min1,min2; //所有节点的相关域置初值-1
for(i=0;i<2*n-1;i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
for(i=n;i<2*n-1;i++) //构造哈夫曼树的分支结点
{
min1=min2=32767; //lnode和rnode为最小权重的两个结点位置
lnode=rnode=-1;
for(k=0;k<=i-1;k++) //查找最小和次小的结点
if(ht[k].parent==-1) //只在尚未构造二叉树的结点中查找
{if(ht[k].weight