1 /***********************************************************
2 maketree.c -- make Huffman tree
3 ***********************************************************/
6 static int n, heapsize;
7 static short heap[NC + 1];
8 static ushort *freq, *sortptr, len_cnt[17];
13 { /* call with i = root */
17 len_cnt[(depth < 16) ? depth : 16]++;
32 for (i = 0; i <= 16; i++)
36 for (i = 16; i > 0; i--)
37 cum += len_cnt[i] << (16 - i);
38 while (cum != (1U << 16)) {
39 fprintf(stderr, "17");
41 for (i = 15; i > 0; i--) {
42 if (len_cnt[i] != 0) {
50 for (i = 16; i > 0; i--) {
59 /* priority queue; send i-th entry down heap */
64 while ((j = 2 * i) <= heapsize) {
65 if (j < heapsize && freq[heap[j]] > freq[heap[j + 1]])
67 if (freq[k] <= freq[heap[j]])
76 make_code(int n, uchar len[], ushort code[])
82 for (i = 1; i <= 16; i++)
83 start[i + 1] = (start[i] + len_cnt[i]) << 1;
84 for (i = 0; i < n; i++)
85 code[i] = start[len[i]]++;
89 make_tree(int nparm, ushort freqparm[], uchar lenparm[], ushort codeparm[])
90 /* make tree, calculate len[], return root */
100 for (i = 0; i < n; i++) {
103 heap[++heapsize] = i;
106 codeparm[heap[1]] = 0;
109 for (i = heapsize / 2; i >= 1; i--)
110 downheap(i); /* make priority queue */
112 do { /* while queue has at least two entries */
113 i = heap[1]; /* take out least-freq entry */
116 heap[1] = heap[heapsize--];
118 j = heap[1]; /* next least-freq entry */
121 k = avail++; /* generate new node */
122 freq[k] = freq[i] + freq[j];
124 downheap(1); /* put into queue */
127 } while (heapsize > 1);
130 make_code(nparm, lenparm, codeparm);
131 return k; /* return root */