我正在尝试创建一个霍夫曼树,我已经有了一个用c语言排序的频率数组。 这是我的结构:
struct node
{
int value;
char letter; /* symbol */
struct node *left,*right; /* left and right subtrees */
};
typedef struct node Node;
在main()里面我有:
int main(){
Node *tree;
FILE *input, *output; //file input and output i am taking because i will take a input text file containing encoding of all 27 alphabets like a= 00001 b= 00010 etc.
buildHuffmanTree(&tree); // see it's function call there i already have done sorting of frequencies using qsort() BUT I DON'T KNOW WHAT TO DO AFTER.
return 0;
}
见这里:
void buildHuffmanTree(Node **tree){
Node *temp;
Node *array[27];
int i, subTrees = 27;
int smallOne;
for (i=0;i<27;i++)
{
array[i] = malloc(sizeof(Node));
array[i]->value = englishLetterFrequencies[i]; //this englishLetterFrequencies[27] contains the the frequencies of all 27 alphabtets like ={81,27,1,12.....up to 27 index of this array}
array[i]->letter = i;
array[i]->left = NULL;
array[i]->right = NULL;
}
//here is the sorting part:
int i = 0; int d,p;
printf("the array frequency is \n");
for(d=0;d < 27;d++)
printf("%d ",array[d]->value);
// sorting of arrays
qsort(array,27,sizeof(*array),cmpfunc);
//////////////////////////
printf("\n the sorted array frequency is \n");
for(p=0;p < 27;p++)
printf("%d ",array[p]->value); //So now this array[p]->value contains all the sorted frequency.
//I DON'T KNOW WHAT TO DO NOW
return;
}
现在有了排序数组,我想到的是..首先我将采用前两个节点(在我的增加顺序的第一和第二个索引排序数组[])然后添加它们并再次排序和形式使用它的树。但我不知道锄头这样做。我是个初学者。任何人都可以解释如何实施它?
答案 0 :(得分:1)
Malloc一个新节点。取两个最低频率的节点并将它们分配给新节点的左侧和右侧,并将它们的频率之和放在新节点的值中。通过向下移动其他元素从数组中删除两个节点。现在,在元素小于value之后,在元素大于value之前,将新节点插入数组中,方法是将大元素向上移动一个元素。现在,该数组少了一个元素。
重复直到数组中有一个元素。那是树的根。
答案 1 :(得分:0)
我最近正在学习HuffmanTree,例如:你有一系列频率,即7,9,2,6,3,经过分类,它变成2,3,6,7,9。我可以'为我的低级scole广告图片... 你总是选择数组的前两个元素,所以2和3,
5
/ \
2 3
你可以得到这个并在你的数组中添加5并删除2和3.so数组现在是5,6,7,9 下一步是选择5和6,所以你可以得到这个:
11
/\
5 6
/ \
2 3
所以删除5和6,将广告11删除到数组中,现在是7,9,11 选择7和9,你可以得到这个:
16
/ \
7 9
删除7和9,并将16添加到数组中,现在为11,16 选择11和16,你可以得到这个:
27
/ \
11 16
/\ /\
5 6 7 9
/\
2 3