Huffman Tree 简单构造

//函数:构造Huffman树HT[2*n-1]
#define MAXVALUE 9999//假设权值不超过9999
#define MAXLEAF 30
#define MAXNODE MAXLEAF*2-1
using namespace std;
#include <iostream> //Using cin or cout
#include <malloc.h> //Using malloc and realloc
#include <stdio.h>  //Using c
#include <stdlib.h>

typedef struct
{
	int weight;//权值
	int parent;//父结点下标
	int lchild;//左孩子下标
	int rchild;//右孩子下标
}HTNode;

void HuffmanTree(HTNode HT[], int n)
{
	int i,j,x1,x2;
	int m1,m2;
    for(i=1;i<=n-1;++i)//n-1个非叶子结点
	{
		m1=m2=MAXVALUE; x1=x2=0;	//m1,m2用来记录结点中最小的权值,x1,x2用来记录其左右子树结点
		for(j=1;j<n+i;++j)
		{

			if(HT[j].parent==0)
			{	if (HT[j].weight<m1) {m2=m1; x2=x1;m1=HT[j].weight; x1=j;}
			    else if(HT[j].weight<m2) { m2=HT[j].weight; x2=j;}
			}
		}
		HT[x1].parent=n+i;
		HT[x2].parent=n+i;
		HT[n+i].weight = HT[x1].weight + HT[x2].weight;
		HT[n+i].lchild=x1;
		HT[n+i].rchild=x2;
	}//外层for循环结束

}
//函数:求Huffman树HT[n]的Huffman编码
#define MAXBIT 20
typedef struct
{
	int bit[MAXBIT];
	int start;
}HCodeType;

void HuffmanCode (HTNode HT[], int n, HCodeType HuffCode[])
{
	HCodeType cd; int i,j,c,p;
	for(i=1;i<=n;++i)
	{
		cd.start=n; c=i; p=HT[c].parent;//p为c双亲
		while(p!=0)
		{
			if(HT[p].lchild==c) cd.bit[cd.start]=0;
			else cd.bit[cd.start]=1;
			cd.start--;  c=p;  p=HT[c].parent ;//保持p为c双亲
		}
		for(j=cd.start+1;j<=n;j++) HuffCode[i].bit[j]=cd.bit[j];
		HuffCode[i].start=cd.start;
	}
	for(i=1;i<=n;++i)
	{
		cout<<"第"<<i<<"个字符的哈夫曼编码为:";
		for(int j=HuffCode[i].start+1;j<=n;j++)
		{

			cout<<HuffCode[i].bit[j];
			//printf("%d",HuffCode[i].bit[j]);
		}
		cout<<endl;
	}
}
int main()
{
	int n=8;
	HTNode HT[MAXNODE];
	for(int i=1; i<=2*n-1; ++i) //初始化
	{
		HT[i].weight=0; HT[i].parent=0;
		HT[i].lchild=0; HT[i].rchild=0;
	}
	for(int i=1;i<=n;++i)
	{
		cout<<"请输入第"<<i<<"个值为:"<<endl;
		scanf("%d",&HT[i].weight);
		if(HT[i].weight>=MAXVALUE)
		{
			printf("超过权值允许的最大值,重新输入!\n");
			--i;
		}
	}
	HuffmanTree(HT,n);
	HCodeType HuffCode[MAXNODE];
	HuffmanCode (HT,n,HuffCode);
}

  

转载于:https://www.cnblogs.com/ygsworld/p/9975543.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值