Advertisement
rootUser

Huffman

Aug 10th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX_TREE_HT 100
  4.  
  5. struct MinHeapNode
  6. {
  7.     char data;
  8.     unsigned freq;
  9.     struct MinHeapNode *left, *right;
  10. };
  11.  
  12. struct MinHeap
  13. {
  14.     unsigned size;
  15.     unsigned capacity;
  16.     struct MinHeapNode **array;
  17. };
  18.  
  19. struct MinHeapNode* newNode(char data, unsigned freq)
  20. {
  21.     struct MinHeapNode* temp =
  22.         (struct MinHeapNode*) malloc(sizeof(struct MinHeapNode));
  23.     temp->left = temp->right = NULL;
  24.     temp->data = data;
  25.     temp->freq = freq;
  26.     return temp;
  27. }
  28.  
  29. struct MinHeap* createMinHeap(unsigned capacity)
  30. {
  31.     struct MinHeap* minHeap =
  32.         (struct MinHeap*) malloc(sizeof(struct MinHeap));
  33.     minHeap->size = 0;
  34.     minHeap->capacity = capacity;
  35.     minHeap->array =
  36.         (struct MinHeapNode**)malloc(minHeap->capacity * sizeof(struct MinHeapNode*));
  37.     return minHeap;
  38. }
  39.  
  40. void swapMinHeapNode(struct MinHeapNode** a, struct MinHeapNode** b)
  41. {
  42.     struct MinHeapNode* t = *a;
  43.     *a = *b;
  44.     *b = t;
  45. }
  46.  
  47.  
  48. void minHeapify(struct MinHeap* minHeap, int idx)
  49. {
  50.     int smallest = idx;
  51.     int left = 2 * idx + 1;
  52.     int right = 2 * idx + 2;
  53.  
  54.     if (left < minHeap->size &&
  55.             minHeap->array[left]->freq < minHeap->array[smallest]->freq)
  56.         smallest = left;
  57.  
  58.     if (right < minHeap->size &&
  59.             minHeap->array[right]->freq < minHeap->array[smallest]->freq)
  60.         smallest = right;
  61.  
  62.     if (smallest != idx)
  63.     {
  64.         swapMinHeapNode(&minHeap->array[smallest], &minHeap->array[idx]);
  65.         minHeapify(minHeap, smallest);
  66.     }
  67. }
  68.  
  69.  
  70. int isSizeOne(struct MinHeap* minHeap)
  71. {
  72.     return (minHeap->size == 1);
  73. }
  74.  
  75.  
  76. struct MinHeapNode* extractMin(struct MinHeap* minHeap)
  77. {
  78.     struct MinHeapNode* temp = minHeap->array[0];
  79.     minHeap->array[0] = minHeap->array[minHeap->size - 1];
  80.     --minHeap->size;
  81.     minHeapify(minHeap, 0);
  82.     return temp;
  83. }
  84.  
  85. void insertMinHeap(struct MinHeap* minHeap, struct MinHeapNode* minHeapNode)
  86. {
  87.     ++minHeap->size;
  88.     int i = minHeap->size - 1;
  89.     while (i && minHeapNode->freq < minHeap->array[(i - 1)/2]->freq)
  90.     {
  91.         minHeap->array[i] = minHeap->array[(i - 1)/2];
  92.         i = (i - 1)/2;
  93.     }
  94.     minHeap->array[i] = minHeapNode;
  95. }
  96.  
  97.  
  98. void buildMinHeap(struct MinHeap* minHeap)
  99. {
  100.     int n = minHeap->size - 1;
  101.     int i;
  102.     for (i = (n - 1) / 2; i >= 0; --i)
  103.         minHeapify(minHeap, i);
  104. }
  105.  
  106.  
  107. void printArr(int arr[], int n)
  108. {
  109.     int i;
  110.     for (i = 0; i < n; ++i)
  111.         printf("%d", arr[i]);
  112.     printf("\n");
  113. }
  114.  
  115.  
  116. int isLeaf(struct MinHeapNode* root)
  117. {
  118.     return !(root->left) && !(root->right) ;
  119. }
  120.  
  121. struct MinHeap* createAndBuildMinHeap(char data[], int freq[], int size)
  122. {
  123.     struct MinHeap* minHeap = createMinHeap(size);
  124.     int i;
  125.     for (i = 0; i < size; ++i)
  126.         minHeap->array[i] = newNode(data[i], freq[i]);
  127.     minHeap->size = size;
  128.     buildMinHeap(minHeap);
  129.     return minHeap;
  130. }
  131.  
  132. struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size)
  133. {
  134.     struct MinHeapNode *left, *right, *top;
  135.  
  136.     struct MinHeap* minHeap = createAndBuildMinHeap(data, freq, size);
  137.  
  138.     while (!isSizeOne(minHeap))
  139.     {
  140.         left = extractMin(minHeap);
  141.         right = extractMin(minHeap);
  142.  
  143.         top = newNode('$', left->freq + right->freq);
  144.         top->left = left;
  145.         top->right = right;
  146.         insertMinHeap(minHeap, top);
  147.     }
  148.  
  149.     return extractMin(minHeap);
  150. }
  151.  
  152. void printCodes(struct MinHeapNode* root, int arr[], int top)
  153. {
  154.     if (root->left)
  155.     {
  156.         arr[top] = 0;
  157.         printCodes(root->left, arr, top + 1);
  158.     }
  159.  
  160.     if (root->right)
  161.     {
  162.         arr[top] = 1;
  163.         printCodes(root->right, arr, top + 1);
  164.     }
  165.  
  166.     if (isLeaf(root))
  167.     {
  168.         printf("%c: ", root->data);
  169.         printArr(arr, top);
  170.     }
  171. }
  172.  
  173. void HuffmanCodes(char data[], int freq[], int size)
  174. {
  175.     struct MinHeapNode* root = buildHuffmanTree(data, freq, size);
  176.  
  177.     int arr[MAX_TREE_HT], top = 0;
  178.     printCodes(root, arr, top);
  179. }
  180.  
  181. int main()
  182. {
  183.     char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};
  184.     int freq[] = {5, 9, 12, 13, 16, 45};
  185.     int size = sizeof(arr)/sizeof(arr[0]);
  186.     HuffmanCodes(arr, freq, size);
  187.     return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement