• 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);
    }
    

      

  • 相关阅读:
    uni-app中使用Echarts绘画图表
    css设置Overflow实现隐藏滚动条的同时又可以滚动
    JS判断在哪一端浏览器打开
    ElementUI分页Pagination自动到第一页
    第203场周赛
    TreeSet使用
    155 最小栈
    234 回文链表
    141 环形链表
    2 两数相加
  • 原文地址:https://www.cnblogs.com/ygsworld/p/9975543.html
Copyright © 2020-2023  润新知