Beispiel #1
0
void generateCodes(const iNode *node, const HuffCode &prefix, HuffCodeMap &outCodes){
	if (const leafNode *lf = dynamic_cast<const leafNode*>(node))
		outCodes[lf->c] = prefix;
	else if (const intNode *in = dynamic_cast<const intNode*>(node)){
		HuffCode leftPrefix = prefix; 
		leftPrefix.push_back(false);
		generateCodes(in->left, leftPrefix, outCodes);

		HuffCode rightPrefix = prefix;
		rightPrefix.push_back(true);
		generateCodes(in->right, rightPrefix, outCodes);
	}
}
Beispiel #2
0
void GenerateCodes(const INode* node, const HuffCode& prefix, HuffCodeMap& outCodes)
{
    if (const LeafNode* lf = dynamic_cast<const LeafNode*>(node))
    {
        outCodes[lf->c] = prefix;
    }
    else if (const InternalNode* in = dynamic_cast<const InternalNode*>(node))
    {
        HuffCode leftPrefix = prefix;
        leftPrefix.push_back(false);
        GenerateCodes(in->left, leftPrefix, outCodes);

        HuffCode rightPrefix = prefix;
        rightPrefix.push_back(true);
        GenerateCodes(in->right, rightPrefix, outCodes);
    }
}
Beispiel #3
0
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);
    }
  }
}
Beispiel #4
0
// 重新建立哈夫曼树
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;
}