zoukankan      html  css  js  c++  java
  • Huffman Tree 简单构造

    //函数:构造Huffman树HT[2*n-1]
    #define MAXVALUE 9999//假设权值不超过9999
    #define MAXLEAF 30
    #define MAXNODE MAXLEAF*2-1
    using namespace std;
    #include <iostream> //Using cin or cout
    #include <malloc.h> //Using malloc and realloc
    #include <stdio.h>  //Using c
    #include <stdlib.h>
    
    typedef struct
    {
    	int weight;//权值
    	int parent;//父结点下标
    	int lchild;//左孩子下标
    	int rchild;//右孩子下标
    }HTNode;
    
    void HuffmanTree(HTNode HT[], int n)
    {
    	int i,j,x1,x2;
    	int m1,m2;
        for(i=1;i<=n-1;++i)//n-1个非叶子结点
    	{
    		m1=m2=MAXVALUE; x1=x2=0;	//m1,m2用来记录结点中最小的权值,x1,x2用来记录其左右子树结点
    		for(j=1;j<n+i;++j)
    		{
    
    			if(HT[j].parent==0)
    			{	if (HT[j].weight<m1) {m2=m1; x2=x1;m1=HT[j].weight; x1=j;}
    			    else if(HT[j].weight<m2) { m2=HT[j].weight; x2=j;}
    			}
    		}
    		HT[x1].parent=n+i;
    		HT[x2].parent=n+i;
    		HT[n+i].weight = HT[x1].weight + HT[x2].weight;
    		HT[n+i].lchild=x1;
    		HT[n+i].rchild=x2;
    	}//外层for循环结束
    
    }
    //函数:求Huffman树HT[n]的Huffman编码
    #define MAXBIT 20
    typedef struct
    {
    	int bit[MAXBIT];
    	int start;
    }HCodeType;
    
    void HuffmanCode (HTNode HT[], int n, HCodeType HuffCode[])
    {
    	HCodeType cd; int i,j,c,p;
    	for(i=1;i<=n;++i)
    	{
    		cd.start=n; c=i; p=HT[c].parent;//p为c双亲
    		while(p!=0)
    		{
    			if(HT[p].lchild==c) cd.bit[cd.start]=0;
    			else cd.bit[cd.start]=1;
    			cd.start--;  c=p;  p=HT[c].parent ;//保持p为c双亲
    		}
    		for(j=cd.start+1;j<=n;j++) HuffCode[i].bit[j]=cd.bit[j];
    		HuffCode[i].start=cd.start;
    	}
    	for(i=1;i<=n;++i)
    	{
    		cout<<"第"<<i<<"个字符的哈夫曼编码为:";
    		for(int j=HuffCode[i].start+1;j<=n;j++)
    		{
    
    			cout<<HuffCode[i].bit[j];
    			//printf("%d",HuffCode[i].bit[j]);
    		}
    		cout<<endl;
    	}
    }
    int main()
    {
    	int n=8;
    	HTNode HT[MAXNODE];
    	for(int i=1; i<=2*n-1; ++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<<"请输入第"<<i<<"个值为:"<<endl;
    		scanf("%d",&HT[i].weight);
    		if(HT[i].weight>=MAXVALUE)
    		{
    			printf("超过权值允许的最大值,重新输入!
    ");
    			--i;
    		}
    	}
    	HuffmanTree(HT,n);
    	HCodeType HuffCode[MAXNODE];
    	HuffmanCode (HT,n,HuffCode);
    }
    

      

  • 相关阅读:
    嵌入式Linux系统移植(二)——交叉编译工具集
    嵌入式linux系统移植(一)
    C语言常用关键语法精华总结
    ARM汇编常用指令
    嵌入式Linux系统移植——uboot常用命令
    VHDL的参数写在一个vhd文件里
    [PAT] 1077 Kuchiguse (20 分)Java
    [PAT] 1073 Scientific Notation (20 分)Java
    [PAT] 1069 The Black Hole of Numbers (20 分)Java
    [PAT] 1065 A+B and C (64bit) (20 分)Java
  • 原文地址:https://www.cnblogs.com/ygsworld/p/9975543.html
Copyright © 2011-2022 走看看