码迷,mamicode.com
首页 > 其他好文 > 详细

算法基础(九):超详细最优二叉树构建(2)求编码

时间:2014-04-27 21:34:00      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:哈夫曼   二叉树   数据结构   算法   最优二叉树   

从叶子到跟逆向求每个字符的赫夫曼编码:

void GetHuffmanCode(HuffmanTree &HT,HuffmanCode &HC,int n)
{	
	char* cd;		
	int c;
	int f;
	int start;
	int i = 0;
	//从叶子到根逆向求每个字符的哈夫曼编码
	printf("\n进入求编码函数...");
	HC = (HuffmanCode)malloc( (n+1) * sizeof(char*));		//分配n个字符编码的头指针向量
	cd = (char*)malloc(n*sizeof(char));		//分配求编码的工作空间,n个,因为有n个叶子节点
	cd[n - 1] = ‘\0‘;						//编码结束符
	for(i = 1;i <= n;++i)					//逐个字符求哈弗曼编码
	{
		start = n - 1;						//编码结束符位置
		for(c = i,f = HT[i].parent;f != 0;c = f,f = HT[f].parent)	//f!=0保证一直朝上走,走到根节点
		{
			if(HT[f].lchild == c)	//判断是否为左孩子
				cd[--start] = ‘0‘;
			else cd[--start] = ‘1‘;	//右孩子			
						
		}
		//退出循环,第i个叶子节点的huffmancode求出,开辟空间,然后赋值,因为HC是char**类型
		HC[i] = (char*)malloc( (n - start) * sizeof(char));
		strcpy(HC[i],cd+start);
		printf("\n编号为:%d,权值为:%d的哈弗曼编码为:",i,HT[i].weight);
		puts(HC[i]);
	}
	free(cd);	//释放工作空间

这段代码加到上一篇文章的头文件里或者main.cpp里面都可以,main.cpp如下:

#include"stdafx.h" 
//#include"BasicGraph2.h"
#include "HuffmanCode.h"
void main()
{ 
	HuffmanTree HT;
	HuffmanCode code;
	int n = 8;
	int m = 15;
	int arr[] = {5,29,7,8,14,23,3,11};
	if(HuffmanCoding(HT,arr,n))	//构建哈弗曼树
		ShowHT(HT,n);			//测试是否正确
	GetHuffmanCode(HT,code,n);	//求哈弗曼编码,结果保存在code中
}

运行结果:

mamicode.com,码迷

结构图:

mamicode.com,码迷

注意:8号和11号和我最初画的位置相反。

算法基础(九):超详细最优二叉树构建(2)求编码

标签:哈夫曼   二叉树   数据结构   算法   最优二叉树   

原文地址:http://blog.csdn.net/zjc_game_coder/article/details/24598983

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!