#icnlude<iostream>
using namespace std;//每次都从权值中重新挑选最小的两位
typedef struct
{
int weight;//权值
int parent,lchild,rchild;//结点的双亲,左孩,右孩
}HTNode,*HuffmanTree;
void Select(HuffmanTree HT,int end,&si,&s2)
{
int min1,min2;
int i=1;
while(HT[i].parent!=0&&i<=end)//找到第一个点
{
i++;
}
min1=HT[i].weight;
s1=i;
i++;
while(HT[i].parent!=0&&i<=end)//找到第二个点
{
i++;
}
if(HT[i].weight<min1)//比较大小 ,如果更小,则,min1保留更小,min2保留一般小
{min2=min1;
s2=s1;
min1=HT[i].weight;
s1=i;
}
else
{
min2=HT[i].weight;
s2=i;
}
/*接着往下找*/
for(int j=i+1;j<=end;j++)
{
if(HT[i].parent!=0)//从剩余的点里找到更小的比较
continue;
if(HT[i].weight<min1)
{
min2=min1;
min1=HT[i].weight;
s2=s1;
s1=j;
}
else if(HT[i].weight>=min1&&HT[i].weight<min2)
{
min2=HT[j].weight;
s2=j;
}
}
}
void CreateHuffmanTree(HuffmanTree &HT,int n)
{
if(n<=1)
return;
m=2*n-1;//有n个叶子结点的哈夫曼树有2n-1个结点 ????
HT=new HTNode[m+1];//0号坐标不使用,但有2n个结点,所以+1
for(int i=1;i<=m;i++)//初始化
{
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
//////////*创建部分*/////////////
int s1=0,s2=0;
for(int i=1;i<=m;i++)
cin>>HT[i].weight;//输入各点的权值
for(int i=n+1;i<=m;++i)
{
Select(HT,i-1,s1,s2);//在HT[k](k>=1&&k<=i-1)里找两个双亲域为0,且权值最小的结点,并返回他们的序号
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复