// The main function that builds Huffman tree struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size) { struct MinHeapNode *left, *right, *top; // Step 1: Create a min heap of capacity equal to size. Initially, there are // modes equal to size. struct MinHeap* minHeap = createAndBuildMinHeap(data, freq, size); // Iterate while size of heap doesn't become 1 while (!isSizeOne(minHeap)) { // Step 2: Extract the two minimum freq items from min heap left = extractMin(minHeap); right = extractMin(minHeap); // Step 3: Create a new internal node with frequency equal to the // sum of the two nodes frequencies. Make the two extracted node as // left and right children of this new node. Add this node to the min heap // '$' is a special value for internal nodes, not used top = newNode('$', left->freq + right->freq); top->left = left; top->right = right; insertMinHeap(minHeap, top); } // Step 4: The remaining node is the root node and the tree is complete. return extractMin(minHeap); }
MinHeapNode* buildHuffmanTree (char data[], int freq[], int size) { MinHeapNode* left; MinHeapNode* right; MinHeapNode* top; MinHeap* minHeap = createAndBuildMinHeap(data,freq,size); while (!isSizeOne(minHeap)) { left = extractMin(minHeap); right = extractMin(minHeap); top = newNode('$', left->freq + right->freq); top->left = left; top->right = right; insertMinHeap(minHeap,top); } return extractMin(minHeap); }
// The main function that builds Huffman tree struct MinHeapNode* buildHuffmanTree(uint16 freq[]) { struct MinHeapNode *left, *right, *top, *ret_node; // Step 1: Create a min heap of capacity equal to size. Initially, there are // modes equal to size. struct MinHeap* minHeap = createAndBuildMinHeap(freq, HUFFMAN_STEPS); if (minHeap == NULL) { hError |= (1 << 5); return NULL; } // Iterate while size of heap doesn't become 1 while (!isSizeOne(minHeap)) { // Step 2: Extract the two minimum freq items from min heap left = extractMin(minHeap); right = extractMin(minHeap); // Step 3: Create a new internal node with frequency equal to the // sum of the two nodes frequencies. Make the two extracted node as // left and right children of this new node. Add this node to the min heap // '$' is a special value for internal nodes, not used top = newNode('$', left->freq + right->freq); if (top == NULL) { hError |= (1 << 6); return NULL; } top->left = left; top->right = right; insertMinHeap(minHeap, top); } // Step 4: The remaining node is the root node and the tree is complete. ret_node = extractMin(minHeap); osal_mem_free(minHeap); return ret_node; }