大家帮我看看这个huffman树的建立函数错在哪了。。。。。
# include<iostream>using namespace std;
typedef struct{
unsigned int weight;
unsigned int parent;
unsigned int lchild;
unsigned int rchild;
}HTNode,*HuffmanTree;//动态分配数组存储赫夫曼树
typedef char* *HuffmanCode;
typedef struct pair{
int s1;
int s2;
}Pair;//用于后面的select函数返回连个最小的下标
Pair select(HuffmanTree HT,int n)//参数为Huffmantree的头指针和节点个数
{//选择两个权值最小的结点的下标
Pair twomin={0,0};
for(int i=1;i<=n&&twomin.s2==0;i++)
{
if((HT+i)->parent==0)//70
{
twomin.s1=i;
for(int j=i+1;j<n&&twomin.s2==0;j++)//???
{
if((HT+j)->parent==0)
twomin.s2=j;
}
}
}//给twomin的两个元素赋初值
for(i=1;i<=n;i++)
{
if((HT+i)->parent==0)
{
if((HT+i)->weight<(HT+twomin.s1)->weight) twomin.s1=i;
else if ((HT+i)->weight<(HT+twomin.s2)->weight) twomin.s2=i;
}
}
return twomin;
}//select 函数
HuffmanTree HuffmanTreeing(int* w,int n)//参数为频度数组的头指针和字符个数
{//w存放n个字符的权值,构造赫夫曼树HT,并求出n个字符的赫夫曼编码Hc
if(n<1)return NULL;
int m=2*n-1;
HuffmanTree HT;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号元素未用
HuffmanTree p=HT+1;
int i;
for(i=1;i<=n;i++,p++,w++)
{
p->weight=*w;
p->parent=0;
p->lchild=0;
p->rchild=0;
}//树的前n个节点赋初值
for(;i<=m;i++,p++)
{
p->weight=0;
p->parent=0;
p->lchild=0;
p->rchild=0;
}//树的第n+1到m个节点赋初值
Pair twomin;//用来记录两个权值最小的结点的下标
for(i=n+1;n<=m;i++)
{//建立赫夫曼树
twomin=select(HT,i-1);//在HT[1]到HT[i-1]中选择parent为0且weight只最小的两个节点,记序号分别为s1和s2
HT[twomin.s1].parent=i,HT[twomin.s2].parent=i;
HT[i].lchild=twomin.s1,HT[i].rchild=twomin.s2;
HT[i].weight=HT[twomin.s1].weight+HT[twomin.s2].weight;
}//返回HuffmanTree的头指针
return HT;
}
int main()
{
const mount=5;
int w[mount]={1,2,3,4,5};
HuffmanTreeing(w,mount);
}