c++ 哈夫曼树的创建 编码 解码

哈夫曼树的创建和编码:

 #include
 #include
 using namespace std;
 typedef struct HT{
 	int weight;
 	int parent;
 	int lchild;
 	int rchild;
 }HTNode,*HuffmanTree;
 typedef char * HuffmanCode;
 void select(HuffmanTree HT,int k,int& S1,int& S2)//S1,S2为两个最小值 且S1HT[i].weight&&HT[i].parent==0)
 		{
 			min=HT[i].weight;
 			S1=i;
		 }
	 }
	 
	for(j=1;j<=k;j++)
 	{
 		if(HT[j].parent==0&&j!=S1)
 		{
 			min=HT[j].weight;
 			S2=j;
 			break;
		 }
	 }//给min一个初始值
	 for(j=1;j<=k;j++)
	 {
	 	if(min>HT[j].weight&&HT[j].parent==0&&j!=S1)
	 	{
	 		min=HT[j].weight;
	 		S2=j;
		 }
	 }
 }
 void Create_HuffmanTree(HuffmanTree &HT,int n)//创建叶子节点数为n的哈夫曼树 
 {
 	int m=2*n-1;//m结点总数  n为叶子数 
 	HT=new HTNode[m+1];//利用数组来存储树的节点
 	for(int i=1;i<=m;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<<"输入第"<>HT[i].weight;//输入权值 
	 } 
	 int s1,s2;
	 for(int i=n;i>n;
 	Create_HuffmanTree(HT,n);
 	CreatehuffmanCode(HT,HC,n);
 	for(int i=1;i<=n;i++)
 	{
 		cout<<"第"<

解码只需根据所给编码从头节点向叶子节点遍历即可
下面给出带有解码的代码:

 #include
 #include
 using namespace std;
 typedef struct HT{
 	int weight;
 	int parent;
 	int lchild;
 	int rchild;
 }HTNode,*HuffmanTree;
 typedef char * HuffmanCode;
 void select(HuffmanTree HT,int k,int& S1,int& S2)//S1,S2为两个最小值 且S1HT[i].weight&&HT[i].parent==0)
 		{
 			min=HT[i].weight;
 			S1=i;
		 }
	 }
	 
	for(j=1;j<=k;j++)
 	{
 		if(HT[j].parent==0&&j!=S1)
 		{
 			min=HT[j].weight;
 			S2=j;
 			break;
		 }
	 }//给min一个初始值
	 for(j=1;j<=k;j++)
	 {
	 	if(min>HT[j].weight&&HT[j].parent==0&&j!=S1)
	 	{
	 		min=HT[j].weight;
	 		S2=j;
		 }
	 }
 }
 void Create_HuffmanTree(HuffmanTree &HT,int n)//创建叶子节点数为n的哈夫曼数 
 {
 	int m=2*n-1;//m结点总数  n为叶子数 
 	HT=new HTNode[m+1];
 	for(int i=1;i<=m;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<<"输入第"<>HT[i].weight;//输入权值 
	 } 
	 int s1,s2;
	 for(int i=n;i>n;
 	Create_HuffmanTree(HT,n);
 	CreatehuffmanCode(HT,HC,n);
 	for(int i=1;i<=n;i++)
 	{
 		cout<<"第"<>ch;
	cout<<"第"<

你可能感兴趣的:(数据结构)