void huffman(OCTET *in, int width, int height) { int frequencies[UniqueSymbols] = {0}; for (int i = 0; i < width * height; i++) { frequencies[in[i]]++; } INode* root = BuildTree(frequencies); HuffCodeMap codes; GenerateCodes(root, HuffCode(), codes); delete root; std::stack<bool> *vec = new std::stack<bool>(); for (int i = 0; i < width * height; i++) { HuffCode c = codes.find(in[i])->second; std::for_each(c.begin(), c.end(), [=](bool b) { vec->push(b); }); if(vec->size() > 8) { std::cout << toChar(vec); } } }
// 重新建立哈夫曼树 INode* BuildTree(HuffCodeMap& dir) { InternalNode* root = new InternalNode(); for (HuffCodeMap::iterator it = dir.begin(); it != dir.end(); ++it) { HuffCode codes = it->second; // 中间只建立父节点 InternalNode* sroot = root; HuffCode::iterator subit = codes.begin(); for (; subit != codes.end() - 1; ++subit) { // 右节点 if (*subit == 't') { // 空 if (sroot->right == NULL) { InternalNode* node = new InternalNode(); sroot->right = node; sroot = node; } else { sroot = (InternalNode*)sroot->right; } } // 左节点 else { if (sroot->left == NULL) { InternalNode* node = new InternalNode(); sroot->left = node; sroot = node; } else { sroot = (InternalNode*)sroot->left; } } } // 最后建立叶节点,用1表示叶节点 LeafNode* node = new LeafNode(1, it->first); // 右节点 if (*subit == 't') { // 空 if (sroot->right == NULL) { sroot->right = node; sroot = (InternalNode*)node; } else { sroot = (InternalNode*)sroot->right; } } // 左节点 else { if (sroot->left == NULL) { sroot->left = node; sroot = (InternalNode*)node; } else { sroot = (InternalNode*)sroot->left; } } } return root; }