哈夫曼树

哈夫曼树

#include 

//哈夫曼树节点个数为2n-1
//n为叶子节点的个数
//故MAX_NODE>2n-1
#define  MAX_NODE  200 
#define  MAX_SIZE  40
#define  INF 32767

//哈夫曼树的数据结构
typedef struct
{     
	//权重
	float weight ;
	//双亲下标,左孩子下标,右孩子下标
	unsigned int parent , lchild , rchild ;
	//哈夫曼编码,我用栈来存
	int code[MAX_SIZE];
	int top;
} HTNode ;

//创建一棵叶子结点数为n的Huffman树
void Huffman(HTNode HT[ ],int n)
{  
	float  w ;   
	int m=2*n-1; 
	int  k , j ;
	// 初始化向量HT
	for (k=1 ; k<=m ; k++)
	{   
		if  (k<=n)
	    {  
	       // 输入各叶子结点的权值
		   printf("\n Please Input Weight : w=?");
	       scanf("%f", &w) ;
		   HT[k].weight=w ;  
	    }        
		else  //非叶子结点权值初始化为0
		{
 	       HT[k].weight=0;	
		}
		//开始的时候全是一棵棵离散的树
		HT[k].parent=-1;
		//都没有孩子
		HT[k].lchild=HT[k].rchild=-1;
	}     
	//贪心法构建哈夫曼树
	//从第一个非叶子节点开始
	for (k=n+1; k<=m ; k++)
	{   
		//w1 , w2分别保存权值最小的两个权值
		//先初始化为无穷大
		float w1=INF , w2 =INF ;
      	//p1 , p2保存两个最小权值的下标
 		int  p1=-1, p2=-1;
     	//寻找权值最小的两个值及其下标
		for (j=1 ; j<=k-1 ; j++)
    	{   
    		//保证两节点均尚未找到父节点
			if (HT[j].parent==-1)
           {   
           	   //当x

你可能感兴趣的:(C/C++,C/C++,哈夫曼树,栈,贪心)