RodneyX

博客园 首页 新随笔 联系 订阅 管理

这个就不谈原理了,很简单的,按课本上写的哈夫曼树构造的算法描述直接写就是了。这里采用常规操作,用小顶堆来加快构造速度,见https://www.cnblogs.com/RodneyTang/p/19013567

代码如下

/*****file:HuffmanTree.h*****/
#ifndef HUFFMANTREE_H
#define HUFFMANTREE_H
#include<stdlib.h>
#define ASCIInum 128
#define INVALID 128

typedef struct HuffmanNode {
    char data;
    int weight;
    struct HuffmanNode *left, *right;
}HuffmanNode;

typedef struct HuffmanTree {
    HuffmanNode *root;
}HuffmanTree;

//only support ASCII
double ASCII_probability[ASCIInum];
//void compute_probability()
void _adjust_minHeap_HuffmanTree(HuffmanNode **nodes_pointers, int pos, int length);
void create_HuffmanTree(HuffmanTree &HT);

#endif


/*****file:HuffmanTree.cpp*****/
#include "HuffmanTree.h"

void _adjust_minHeap_HuffmanTree(HuffmanNode **nodes_pointers, int pos, int length) {
    int i = pos, k;
    HuffmanNode *sift = nodes_pointers[pos];
    while(true) {
        k = i * 2 + 1;
        if(k < length && k + 1 < length && nodes_pointers[k]->weight > nodes_pointers[k + 1]->weight)
            ++k;
        if(k < length && sift->weight > nodes_pointers[k]->weight) {
            nodes_pointers[i] = nodes_pointers[k];
            i = k;
        }
        else {
            nodes_pointers[i] = sift;
            break;
        }
    }
}

void create_HuffmanTree(HuffmanTree &HT) {
    HuffmanNode **nodes_pointers = (HuffmanNode**)malloc(sizeof(HuffmanNode*) * ASCIInum);
    for(int i = 0; i < ASCIInum; ++i) {
        nodes_pointers[i] = (HuffmanNode*)malloc(sizeof(HuffmanNode));
        nodes_pointers[i]->data = i;
        nodes_pointers[i]->weight = ASCII_probability[i];
        nodes_pointers[i]->left = nodes_pointers[i]->right = nullptr;
    }

    //create minHeap
    for(int i = (ASCIInum - 1) / 2; i >= 0; --i)
        _adjust_minHeap_HuffmanTree(nodes_pointers, i, ASCIInum);
    
    //create Huffman Tree
    HuffmanNode *p = nullptr, *lchild = nullptr, *rchild = nullptr;
    for(int i = 0; i < ASCIInum - 1; ++i) {
        lchild = nodes_pointers[0];
        nodes_pointers[0] = nodes_pointers[ASCIInum - 1 - i];
        _adjust_minHeap_HuffmanTree(nodes_pointers, 0, ASCIInum - 1 - i);

        rchild = nodes_pointers[0];

        p = (HuffmanNode*)malloc(sizeof(HuffmanNode));
        p->weight = lchild->weight + rchild->weight;
        p->data = INVALID;
        p->left = lchild;
        p->right = rchild;

        nodes_pointers[0] = p;
        _adjust_minHeap_HuffmanTree(nodes_pointers, 0, ASCIInum - 1 - i);
    }
    HT.root = nodes_pointers[0];
    free(nodes_pointers);
}
posted on 2025-08-12 16:35  RodneyX  阅读(6)  评论(0)    收藏  举报