#include<stdio.h>
#include<stdlib.h>
typedef struct treenode
{
int weight;
int parent;/*父节点和孩子节点对应的索引*/
int lchild;
int rchild;
}treenode;
typedef struct HFtree
{
treenode* node;
int length;
}HFtree;
HFtree* initHFtree(int* weight,int length)//传入权值
{
HFtree* T= (HFtree*)malloc(sizeof(HFtree));
T->node = (treenode*)malloc(sizeof(treenode)*(2*length-1));//最后的节点个数是2*length-1
T->length = length;
int i;
for(i = 0;i<length;i++)
{
T->node [i].weight = weight[i];
T->node [i].parent = 0;
T->node [i].lchild = -1;
T->node [i].rchild = -1;//处理前每一个节点都没有子树
}
return T;
}
int* selectMin(HFtree* T)//选出最小和次小
{
int min = 1000;
int second = 1000;
int minindex,secondindex,i;
for(i = 0;i<T->length;i++)
{
if(T->node [i].parent==0)//没有当过孩子节点的节点
{
if(T->node [i].weight<min)
{
min = T->node [i].weight;
minindex = i;
}
}
}
for(i = 0;i<T->length ;i++)
{
if(T->node [i].parent==0&&i!=minindex)
{
if(T->node [i].weight<second)
{
second = T->node [i].weight;
secondindex = i;
}
}
}
int* res;//用指针储存最小和次小值的下标,这样就可以同时返回两个值
res = (int*)malloc(sizeof(int)*2);
res[0] = minindex;
res[1] = secondindex;
return res;
}
void createHFtree(HFtree* T)
{
int* res;
int min,second,i;
int length = T->length ;
int fin = T->length *2-1;
for(i =T->length ;i<fin;i++)
{
res = selectMin(T);
min = res[0];
second = res[1];
T->node[i].weight = T->node [min].weight+T->node [second].weight;
T->node [i].lchild = min;
T->node [i].rchild = second;//该节点有了左孩子和右孩子
T->node [min].parent = i;
T->node [second].parent = i;//左右孩子有了父节点
length++;//节点加一
}
}
哈夫曼树的实现C语言
最新推荐文章于 2024-06-05 08:23:32 发布