如何在c中创建huffman树(已经有一个排序数组)

如何在c中创建huffman树(已经有一个排序数组),c,tree,huffman-code,C,Tree,Huffman Code,我正在尝试创建一个哈夫曼树,我已经有了一个c语言的频率排序数组。 以下是我的结构: struct node { int value; char letter; /* symbol */ struct node *left,*right; /* left and right subtrees */ }; typedef struct node Node; 在main()中,我有: 请看这里: void buildHuffmanTree

我正在尝试创建一个哈夫曼树,我已经有了一个c语言的频率排序数组。 以下是我的结构:

struct node
{
    int value;
    char letter;                 /* symbol */
    struct node *left,*right;    /* left and right subtrees */
};
typedef struct node Node;
在main()中,我有:

请看这里:

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;
}
void buildHuffmanTree(节点**树){
节点*温度;
节点*数组[27];
int i,子树=27;
int smallOne;
for(i=0;ivalue=englishLetterFrequencies[i];//此englishLetterFrequencies[27]包含所有27个字母集的频率,如={81,27,1,12….....此数组的27个索引}
数组[i]->字母=i;
数组[i]->left=NULL;
数组[i]->right=NULL;
}
//以下是排序部分:
int i=0;int d,p;
printf(“阵列频率为\n”);
对于(d=0;d<27;d++)
printf(“%d”,数组[d]->值);
//数组排序
qsort(数组,27,sizeof(*数组),cmpfunc);
//////////////////////////
printf(“\n排序的数组频率为“\n”);
对于(p=0;p<27;p++)
printf(“%d”,数组[p]->value);//所以现在这个数组[p]->值包含所有排序的频率。
//我不知道现在该怎么办
返回;
}

现在,对于排序数组,我想到的是..首先,我将获取前两个节点(它们位于递增顺序排序数组[]的第一个和第二个索引中)然后添加它们并再次排序,然后使用它形成一个树。但我不知道该怎么做。我是一个初学者。任何人都可以解释如何实现它?

我最近在学习HuffmanTree,例如:你有一个频率数组,它是7,9,2,6,3,排序后,它变成了2,3,6,7,9。我无法为我的低scole添加图片。。。 总是选择数组的前两个元素,所以2和3

  5
 / \
2   3
你可以得到这个,然后在数组中添加5,删除2和3。所以现在数组是5,6,7,9 下一步是选择5和6,这样您可以得到:

   11
   /\
  5  6
 / \
2   3
  16
 /  \
7    9
      27
     / \
    11  16
   /\   /\
  5  6 7  9         
 /\
2  3
所以删除5和6,以及AD11到数组中,现在是7,9,11 选择7和9,您可以得到:

   11
   /\
  5  6
 / \
2   3
  16
 /  \
7    9
      27
     / \
    11  16
   /\   /\
  5  6 7  9         
 /\
2  3
删除7和9,将16添加到数组中,现在是11,16 选择11和16,您可以得到:

   11
   /\
  5  6
 / \
2   3
  16
 /  \
7    9
      27
     / \
    11  16
   /\   /\
  5  6 7  9         
 /\
2  3

Malloc一个新节点。将两个最低频率的节点分配到新节点的左侧和右侧,并将它们的频率之和放入新节点的值中。通过向下移动其他元素,从数组中删除这两个节点。现在将新节点插入数组中小于值的元素之后和大于值的元素之前,通过将较大的元素向上移动一个。数组现在少了一个元素


重复此操作,直到数组中有一个元素。这是树的根。

停止叫喊。它不会给你更多答案。这是请求(不是叫喊)不管怎样,谢谢你的回答。他的意思是你不应该像这样使用所有的大写字母。请将你的问题改成这样。@MarkAdler谢谢,我是堆栈溢出的新手,这是我的第二个问题,事实上,我无法理解他的语言。我已经做了你要求我做的更改。你能告诉我如何实现我想要做的吗?但如何做到这一点是我的问题,我已经对频率数组进行了排序,之后要做什么?一些代码会很有用。如果你知道哈夫曼树是什么,那么你可以有自己的代码。我有一个数组,其中包含所有排序的频率,但我不知道删除这两个节点。我不知道如何做。我需要使用吗指针?假设数组中有5个元素,称为“array[5]={1,2,3,4,5,}”现在如何删除数组大小?我说了如何。将未删除的元素向下移动一个。要删除3个,将4个移动到3个点,然后将5个移动到4个点。然后减少数组中的元素数。嗨@MarkAdler,我成功地将排序后的数组在线性时间内变成了一个最优的哈夫曼树(即,没有优先级队列,也没有移动元素)。如下所述:。我觉得我的方法中一定有错误,但我看不到任何错误。简言之:您在数组a中对叶进行了排序,在空数组B中对叶进行了排序。您将新的内部节点放置到B中(从左到右),所以它也保持排序。最便宜的节点总是在A和B的开头找到。*****实际上,B可以在A的开头创建,因为A的元素从左侧移除(您可以在“旧内存”中工作)。