创建哈夫曼树(huffmantree)以及得到哈夫曼编码

#include <stdio.h>
#include <malloc.h>
#include <cstring>
#include <stdlib.h>
#include <limits.h>

typedef struct hnode{
	int weight;
	int lchild,rchild,parent;
}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树 

typedef char** HuffmanCode;//动态分配数组存储哈夫曼编码表 
//这是一个定义了一个指向字符指针数组的类型别名。具体来说,
//HuffmanCode是一个指向char*类型的指针的指针,也就是一个二维字符数组。
//在Huffman编码中,通常会使用这种数据结构来存储每个字符对应的编码。


void Select(HuffmanTree &HT,int len,int &s1,int &s2);
 
void CreatHuffman_tree(HuffmanTree &HT,int n)
{
	int s1,s2;
	
	if(n<=1)
	return ;
	
	int m=2*n-1;
	HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); 
//	HT=new HTNode[m+1]; //new关键字用于动态分配内存空间。
	//它用于在运行时创建一个对象数组。HT=new HTNode[m+1]的意思是,
	//使用new操作符为HT分配了一个大小为m+1的HTNode对象数组,并将其地址赋值给HT。
	for(int i=1;i<=m;i++)
	{
		HT[i].parent=0;
		HT[i].lchild=HT[i].rchild=0;
	} 
	printf("哈夫曼各结点的值为:");
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&HT[i].weight);
	 } 
	 for(int i=n+1;i<=m;i++)
	 {
	 	Select(HT,i-1,s1,s2);
	 	HT[s1].parent=HT[s2].parent=i;
	 	HT[i].lchild=s1;
	 	HT[i].rchild=s2;
	 	HT[i].weight=HT[s1].weight+HT[s2].weight;
	 }
	
} 


void Select(HuffmanTree &HT,int len,int &s1,int &s2)//在len中找最小的两个元素
{//选出权值最小的两个结点,下标通过s1和s2传出去 
	int min1=INT_MAX,min2=INT_MAX;
	for(int i=1;i<=len;i++)
	{
		if(HT[i].weight<min1&&HT[i].parent==0)
		{
			s2=s1;//这两步操作是为了s2能够找到第二小的数 
			min2=min1;
			s1=i;
			min1=HT[i].weight;	
		}
		else if(HT[i].weight<min2&&HT[i].parent==0)//这个情况是为了第一个结点就是最小的 
        {    min2=HT[i].weight;
            s2=i;
        }
	}
}

void Huffman_code(HuffmanTree &HT,HuffmanCode &HC,int n)
{
	char *cd;
	int start=0;
	int c=0,f=0;
	HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
//	HC=new char*[n+1];
	cd=(char*)malloc(n*sizeof(char));
//	cd=new char[n];
	cd[n-1]='\0';
	for(int i=1;i<=n;i++)
	{
		start=n-1;
		c=i;//表示查找第c个结点
		f=HT[i].parent;//记录第图i个结点的双亲
		while(f!=0)
		{
			if(HT[f].lchild==c)
			{
				cd[--start]='0';
			}
			else 
			{
				cd[--start]='1';
			}
			c=f;
			f=HT[f].parent;
		} 
		//HC[i]=new char[n-start+1];
		HC[i]=(char*)malloc((n-start+1)*sizeof(char));
		strcpy(HC[i],&cd[start]);
	}
//	delete cd;
	free(cd);
}


int main(void)
{
	HuffmanTree HT;//哈夫曼树HT
	HuffmanCode HC;//n个字符的哈夫曼编码HC 
	
	printf("请输出哈夫曼的结点的个数:");
	int n;
	scanf("%d",&n);
	
	CreatHuffman_tree(HT,n);//建立哈夫曼树 
	 
	 Huffman_code(HT,HC,n);
	 
	 for(int i=1;i<=n;i++)
	 {
	 	printf("第%d个编码为%s\n",i,HC[i]);
	 }
	 return 0;
} 

代码里有注释,有前面线性表的基础,哈夫曼还是可以完成的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值