哈夫曼树

#include <iostream>
#include <stdio.h>
using namespace std;
#define MaxWeight 1000      //最大权值
#define MaxBit    1000          //编码最大位数
#define MaxN    1000        //最多结点数
typedef struct  
{
	int flag;       //标记
	int weight;     //权值
	int parent;     //父结点
	int left;       //左结点
	int right;      //右结点
}HuffmanTreeNode;
typedef struct  
{
	int bit[MaxBit];    //编码数组
	int start;         //编码位数
}HuffmanCode;
class Huffman
{
public:
	Huffman(HuffmanTreeNode *&,HuffmanCode *&,int n);
	void MakeHuffman(int weight[],int n);
	void CodeHuffman(int n);
private:
	HuffmanTreeNode *huffmantreenode;
	HuffmanCode     *huffmancode;
};
Huffman::Huffman(HuffmanTreeNode *& ht,HuffmanCode *& hc,int n)
{
	ht=new HuffmanTreeNode[2*n-1];
	hc=new HuffmanCode[n];
	huffmantreenode=ht;
	huffmancode=hc;
}
void Huffman::MakeHuffman(int weight[],int n)
{
	int i,j,x1,x2,m1,m2;  //初始化,m1,m2分别保存最小和次小值 
	for(i=0;i<2*n-1;++i)
	{
		if(i<n)
		huffmantreenode[i].weight=weight[i];
		else
		huffmantreenode[i].weight=0;
		huffmantreenode[i].flag=0;
		huffmantreenode[i].parent=0;
		huffmantreenode[i].left=-1;
		huffmantreenode[i].right=-1;
	}
	for(i=0;i<n-1;++i)     //n-1次构造步骤
	{
		m1=m2=MaxWeight;
		x1=x2=0;
	   for(j=0;j<n+i;++j)
	   {
		   if(huffmantreenode[j].weight<=m1&&huffmantreenode[j].flag==0)  // x<=m1<m2
		   {
			   m2=m1;
			   x2=x1;
			   m1=huffmantreenode[j].weight;
			   x1=j;
		   }
		   else if(huffmantreenode[j].weight<m2&&huffmantreenode[j].flag==0)  //m1<x<m2
		   {
			   x2=j;
			   m2=huffmantreenode[j].weight;
		   }
	   }
	   //开始合并 
	   huffmantreenode[n+i].weight=huffmantreenode[x1].weight+huffmantreenode[x2].weight;
	   huffmantreenode[x1].flag=1;
	   huffmantreenode[x2].flag=1;
	   huffmantreenode[n+i].left=x1;
	   huffmantreenode[n+i].right=x2;
	   huffmantreenode[x1].parent=n+i;
	   huffmantreenode[x2].parent=n+i;
	}
}
void Huffman::CodeHuffman(int n)
{
	HuffmanCode *hc=new HuffmanCode;
	int i,j,child,parent;
	for(i=0;i<n;++i)
	{
		hc->start=n-1;            //最大编码数为n-1
		child=i;
		parent=huffmantreenode[child].parent;
		while(parent!=0) 	//由下往上推	                                                                    
			{ if(huffmantreenode[parent].left==child)
				hc->bit[hc->start]=0;  //左编码为0
			else if(huffmantreenode[parent].right==child)
				hc->bit[hc->start]=1;  //右编码为1
			hc->start--;
			child=parent;
			parent=huffmantreenode[child].parent;
		}
		for(j=hc->start+1;j<n;j++)  //赋值编码
		huffmancode[i].bit[j]=hc->bit[j];
		huffmancode[i].start=hc->start;
	}
}
int main()
{
	cout<<"哈夫曼树测试"<<endl;
	int i,j,n,weight[MaxN];
	printf("Please input weight array\n");
	printf("Input the numbers of array\n");
	cin>>n;
	for(i=0;i<n;++i)
	cin>>weight[i];
	HuffmanTreeNode *ht;
	HuffmanCode     *hc;
	Huffman  myHuffman(ht,hc,n);
	myHuffman.MakeHuffman(weight,n);
	myHuffman.CodeHuffman(n);
	printf("Result of huffmancode\n");
	for(i=0;i<n;++i)
	{
		cout<<"weight="<<ht[i].weight<<" Code=";
		for(j=hc[i].start+1;j<n;++j)
		cout<<hc[i].bit[j];
		cout<<endl;
	}
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值