哈夫曼树的构建和编码

#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;

struct Huffman
{
	int weight;
	int parent;
	int LChild;
	int RChild;
};

struct HuffmanCode
{
	char bits[100];
};

void Select(Huffman T[],int n,int &s1,int &s2)
{
	int min,i;
	for(i=1;i<=n;i++)
	{
		if(T[i].parent==0)
		{
			min=i;
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(T[i].parent==0)
		{
			if(T[i].weight<T[min].weight)
			{
				min=i;
			}
		}
	}
	s1=min;
	//
	for(i=1;i<=n;i++)
	{
		if(T[i].parent==0&&i!=s1)
		{
			min=i;
			break;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(T[i].parent==0&&i!=s1)
		{
			if(T[i].weight<T[min].weight)
			{
				min=i;
			}
		}
	}
	s2=min;
}

void Init(Huffman T[],int w[],int n)
{
	int i,s1,s2;
	for(i=1;i<=n;i++)
	{
		T[i].weight=w[i];
		T[i].parent=0;
		T[i].LChild=0;
		T[i].RChild=0;
	}
	for(i=n+1;i<=2*n-1;i++)
	{
		T[i].weight=0;
		T[i].parent=0;
		T[i].LChild=0;
		T[i].RChild=0;
	}
	for(i=n+1;i<=2*n-1;i++)
	{
		Select(T,i-1,s1,s2);
		T[i].weight=T[s1].weight+T[s2].weight;
		T[s1].parent=i;
		T[s2].parent=i;
		T[i].LChild=s1;
		T[i].RChild=s2;
	}
	cout<<"初始化完成!"<<endl;
}

void CreateCode(Huffman T[],HuffmanCode ST[],int n)
{
	int c,start,p,i;
	char cd[1000];
	cd[n-1]='\0';
	for(i=1;i<=n;i++)
	{
		start=n-1;
		c=i;
		p=T[i].parent;
		while(p!=0)
		{
			start--;
			if(T[p].LChild==c)
			cd[start]='0';
			else
			cd[start]='1';
			c=p;
			p=T[p].parent;
		}
		strcpy(ST[i].bits,&cd[start]);
	}
}

int main()
{
	int n,i;
	int w[1000];//用来存放权值 
	Huffman T[1000];
	HuffmanCode ST[1000];
	cout<<"请输入哈夫曼树的结点数: ";
	cin>>n;
	cout<<"接下来输入每个结点的权值:";
	for(i=1;i<=n;i++)
	cin>>w[i];
	cout<<"接下来初始化一个哈夫曼树:"<<endl;
	Init(T,w,n);
	cout<<"接下来创建哈夫曼编码:"<<endl;
	CreateCode(T,ST,n);
	for(i=0;i<=2*n-1;i++)
	cout<<T[i].weight<<' ';
	cout<<endl;
	for(i=1;i<=n-1;i++)
	cout<<ST[i].bits<<' ';
}

猜你喜欢

转载自blog.csdn.net/weixin_43579811/article/details/89675164
今日推荐