Как создать дерево Хаффмана в c (уже есть отсортированный массив)

Я пытаюсь создать дерево Хаффмана, у меня уже есть отсортированный массив частот на языке 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;
}

Теперь с отсортированными массивами. Я имею в виду следующее. Сначала я возьму первые два узла (которые находятся в первом и втором индексе моего отсортированного массива в порядке возрастания []), а затем добавлю их и снова отсортирую и сформирую дерево, используя Это. Но я не знаю, как это сделать. Я новичок. кто-нибудь может объяснить, как это реализовать?


person user3085082    schedule 07.01.2014    source источник
comment
Хватит кричать. Это не даст вам больше ответов.   -  person user2357112 supports Monica    schedule 07.01.2014
comment
В любом случае, это была просьба (не кричать), спасибо за ответ   -  person user3085082    schedule 07.01.2014
comment
ОН ЗНАЧИТ, ЧТО ВЫ НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ВСЕ ТАКИЕ БОЛЬШИЕ БУКВЫ. Отредактируйте свой вопрос, чтобы он выглядел так.   -  person Mark Adler    schedule 07.01.2014
comment
@MarkAdler спасибо, я новичок в переполнении стека, на самом деле это мой второй вопрос, поэтому я не мог понять его язык. Я внес изменения, которые вы просили меня сделать. Не могли бы вы дать мне представление о том, как реализовать то, что я хочу сделать?   -  person user3085082    schedule 07.01.2014


Ответы (2)


Malloc новый узел. Возьмите два узла с самой низкой частотой и назначьте их слева и справа от нового узла, а сумму их частот поместите в значение нового узла. Удалите два узла из массива, переместив остальные элементы вниз. Теперь вставьте новый узел в массив после элементов меньше значения и перед элементами больше значения, переместив большие элементы вверх на единицу. В массиве теперь на один элемент меньше.

Повторяйте, пока в массиве не останется один элемент. Это корень дерева.

person Mark Adler    schedule 08.01.2014
comment
У меня есть массив, содержащий все отсортированные частоты, но я не знаю, как удалить два узла. Я не знаю, как это сделать. Нужно ли использовать указатель? Предположим, у меня есть 5 элементов в массиве с именем array[5]={1,2,3,4,5,}, как теперь удалить размер массива? - person user3085082; 08.01.2014
comment
Я сказал как. Переместить не удаленные элементы вниз на один. Чтобы удалить 3, переместите 4 на позицию три, а затем 5 на позицию 4. Затем уменьшите количество элементов в массиве. - person Mark Adler; 08.01.2014
comment
Привет @MarkAdler, мне удалось превратить отсортированный массив в оптимальное дерево Хаффмана за линейное время (т.е. без приоритетной очереди и без смещения элементов). Это описано здесь: reddit.com/r/photopea/comments/ikekht/ uzipjs_questions . Я чувствую, что в моем методе должна быть какая-то ошибка, но я не вижу ее. - person Ivan Kuckir; 01.09.2020
comment
Вкратце: у вас есть отсортированные листы в массиве A и пустой массив B. Вы помещаете новые внутренние узлы в B (слева направо), поэтому он также остается отсортированным. Самые дешевые узлы всегда находятся в начале A и B. ****** На практике B можно создать в начале A, так как элементы A удаляются с левой стороны (и вы можете работать в старая память). - person Ivan Kuckir; 01.09.2020

Недавно я изучаю HuffmanTree, например: у вас есть массив частот, который равен 7,9,2,6,3, после сортировки он становится 2,3,6,7,9. Я не могу рекламировать картинку для моего низкого уровня... вы всегда выбираете первые два элемента массива, поэтому 2 и 3,

  5
 / \
2   3

вы можете получить это и добавить 5 в свой массив и удалить 2 и 3. поэтому массив теперь равен 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
person Nibnat    schedule 07.01.2014
comment
Но как это сделать, это мой вопрос, я отсортировал массив частот, что делать после? некоторый фрагмент кода будет заметен. - person user3085082; 07.01.2014
comment
Если вы знаете, что такое дерево Хаффмана, то у вас может быть свой собственный код. - person Nibnat; 07.01.2014