Huffman编码

#include<vector>
#include<iostream>
#include<array>
#include<sstream>
#include<string>
#include<stack>
#include<list>
using namespace std;

typedef struct node
{
	float value;
	node * leftChild;
	node * rightChild;
	string HuffmanCode;
}Node;

/************************************************************************/
/* input numbers                                                                     */
/************************************************************************/
void input(vector<Node>&ArrayNum)
{
	int nums;
	cout<<"input  numbers of array:"<<endl;
	cin>>nums;
	cout<<"input numbers:"<<endl;
	for (auto i=0;i<nums;i++)
	{
		Node temp;
		cin>>temp.value;
		temp.leftChild = NULL;
		temp.rightChild =NULL;
		ArrayNum.push_back(temp);
	}
}

/************************************************************************/
/* minHeapFy                                                                     */
/************************************************************************/
void MinHeapify(vector<Node>&ArrayNum,int i)
{
	int leftChild = 2*i+1;
	int rightChild = 2*i+2;
	int minPos = i;
	if (leftChild<=ArrayNum.size()-1&&ArrayNum[leftChild].value<ArrayNum[i].value)
	{
		minPos = leftChild;
	}
	if (rightChild<=ArrayNum.size()-1&&ArrayNum[rightChild].value<ArrayNum[minPos].value)
	{
		minPos = rightChild;
	}
	if (minPos == i)
	{
		return;
	}
	swap(ArrayNum[i],ArrayNum[minPos]);
	MinHeapify(ArrayNum,minPos);
}
/************************************************************************/
/*  build Heap                                                              */
/************************************************************************/
void buildMinHeap(vector<Node>&ArrayNum)
{
	for (int i = ArrayNum.size()/2 -1;i!=-1;i--)
	{
		MinHeapify(ArrayNum,i);
	}
}
/************************************************************************/
/* extract-min                                                                     */
/************************************************************************/
Node ExtractMin(vector<Node>&ArrayNum)
{
	Node result = ArrayNum[0];
	swap(ArrayNum[ArrayNum.size()-1],ArrayNum[0]);
	ArrayNum.erase(ArrayNum.end()-1);
	if (!ArrayNum.empty())
	{
		MinHeapify(ArrayNum,0);
	}
	return result;
}
/************************************************************************/
/* insert a node into the heap                                                                     */
/************************************************************************/
void insertNode(vector<Node>&ArrayNum,Node p)
{
	ArrayNum.push_back(p);
	int p_pos =ArrayNum.size()-1;
	int p_parent = (p_pos-1)/2;
	while(p_parent>=0 && ArrayNum[p_pos].value<ArrayNum[p_parent].value)
	{
		swap(ArrayNum[p_pos],ArrayNum[p_parent]);
		p_pos = p_parent;
		p_parent = (p_pos-1)/2;
	}
}
/************************************************************************/
/* 递归遍历二叉树并生成huffman码,存在每个节点中                                */
/************************************************************************/
void visitBiTree(Node & root)
{
	if (&root!=NULL )
	{
		if (root.leftChild!=NULL)
		{
			root.leftChild->HuffmanCode = root.HuffmanCode+"0";
			visitBiTree(*root.leftChild);
		}
		if (root.rightChild!=NULL)
		{
			root.rightChild->HuffmanCode = root.HuffmanCode+"1";
			visitBiTree(*root.rightChild);
		}
	}
}
/************************************************************************/
/* output huffman  code                                                                  */
/************************************************************************/
void outputHuffmanCode(Node const& root)
{
	if (&root!=NULL)
	{
		cout<<root.value<<":"<<root.HuffmanCode<<endl;
		outputHuffmanCode(*root.leftChild);
		outputHuffmanCode(*root.rightChild);
	}
}

int main()
{
	vector<Node>ArrayNum;
	input(ArrayNum);
	buildMinHeap(ArrayNum);
	int originNumber = ArrayNum.size();
	/************************************************************************/
	/* 利用堆,每次从小根堆中抽取最小的两个数,生成一个新节点,将这两个数作为新节点的孩子,
	新节点的值为两者值之和,将新节点加入堆中*/
	/************************************************************************/
	for (int i=0;i<originNumber-1;i++)
	{
		Node * leftLeaf = new Node;
		*leftLeaf = ExtractMin(ArrayNum);
		Node * rightLeaf = new Node;
		* rightLeaf = ExtractMin(ArrayNum);
		Node * parent = new Node;
		parent->leftChild = leftLeaf;
		parent->rightChild = rightLeaf;
		parent->value = leftLeaf->value+rightLeaf->value;
		insertNode(ArrayNum,*parent);
	}
	Node root = ExtractMin(ArrayNum);
	root.HuffmanCode = "";
	visitBiTree(root);
	outputHuffmanCode(root);
	system("pause");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值