哈夫曼树压缩 字符串编码

假设只有0-9这十个字符组成的字符串
#define Size 10
int freq[Size];
string code[Size];
string word;
struct Node
{
	int id;
	int freq;
	Node *left;
	Node *right;
	Node(int freq_in):id(-1), freq(freq_in)
	{
		left = right = NULL;
	}
};
struct NodeLess
{
	bool operator()(const Node *a, const Node *b) const 
	{
		return a->freq < b->freq;
	}
};

void init()
{
	for(int i = 0; i < Size; ++i)
		freq[i] = 0;
	for(int i = 0; i < word.size(); ++i)
		++freq[word[i]];
}
void dfs(Node *root, string res)
{
	if(root->id >= 0)
		code[root->id] = res;
	else
	{
		if(NULL != root->left)
			dfs(root->left, res+"0");
		if(NULL != root->right)
			dfs(root->right, res+"1");
	}
}

void deleteNodes(Node *root)
{
	if(NULL == root)
		return ;
	if(NULL == root->left && NULL == root->right)
		delete root;
	else
	{
		deleteNodes(root->left);
		deleteNodes(root->right);
		delete root;
	}
}
void BuildTree()
{
	priority_queue<Node*, vector<Node*>, NodeLess> nodes;
	for(int i = 0; i < Size; ++i)
	{
//0 == freq[i] 的情况未处理
                Node *newNode = new Node(freq[i]);
		newNode->id = i;
		nodes.push(newNode);
	}
	while(nodes.size() > 1)
	{
		Node *left = nodes.top();
		nodes.pop();
		Node *right = nodes.top();
		nodes.pop();
		Node *newNode = new Node(left->freq + right->freq);
                newNode->left = left;
                newNode->right = right;
                nodes.push(newNode);
	}
	Node *root = nodes.top();
	dfs(root, string(""));
	deleteNodes(root);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值