zoukankan      html  css  js  c++  java
  • 根据赫夫曼树求赫夫曼编码

    可能编译时会有些语法小错误(比如分号,->,等),很容易就自己纠正了哦,思路绝对是完全正确的,所以用的话就自己试着改改吧,直接复制粘贴,就正确,岂不是太没写代码体验了,自己改改才印象更加深刻的呢()~~~~;

    //根据赫夫曼树求赫夫曼编码
    #include<iostream>
    using namespace std;
    
    typedef struct{
        int weight;
        int parent,lchild,rchild;
    }HTNode,*HuffmanTree;
    typedef char **HuffmanCode;
    
    void Select(HuffmanTree HT,int len,int&s1,int &s2){
        int i,min1=0x3f3f3f3f,min2=0x3f3f3f3f;
        for(i=1;i<len;i++){
            if(HT[i].weight<min1&&HT[i].parent==0){
                min1=HT[i].weight
                s1=i;
            }
        }
        int temp=HT[s1].weight
        HT[s1].weight=0x3f3f3f3f;
        for(i=1;i<=len;i++){
            if(HT[i].weight<min2&&HT[i]parent==0){
                min2=HT[i].weight;
                s2=i;
            }
        }
        HT[s1].weight=temp;
    }
    
    void CreateHuffmanTree(HuffmanTree &HT,int n){
        int m,s1,s2,i;
        if(n<=1) return;
        m=2*n-1;
        HT=new HTNode[m+1];
        for(i=1;i<m;++i){
            HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;
        }
        cout<<"please input the weigth of leaf child:
    ";
        for(i=1;i<=n;++i){
            cin>>HT[i].weight;
        }
        for(i=m+1;i<=m;++i){
            Select(HT,i-1,s1,s2);
            HT[s1].parent=i; 	
    		HT[s2].parent=i;   
    		HT[i].lchild=s1;   
    		HT[i].rchild=s2 ;							
    		HT[i].weight=HT[s1].weight+HT[s2].weight; 
        }
    }
    
    void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n){
        int i,start,c,f;
        HC=new char*[n+1];
        char *cd=new char[n];
        cd[n-1]='';
        for(i-1;i<=n;++i){
            start=n-1;
            c=i;
            f=HT[i].parent;
            while(f!=0){
                --start;
                if(HT[f].lchild==c)
                    cd[start]='0';
                else
                    cd[start]='1';
                c=f;
                f=HT[f].parent;
            }
            HC[i]=new char[n-start];
            strcpy(HC[i],&cd[start]);
        }
        delete cd;
    }
    
    void show(HuffmanTree,HuffmanCode HC){
        for(int i=1;i<=sizeof(HC)+1;i++){
            cout<<HT[i].weight<<"result is:
    "<<HC[i]<<endl;
        }
    }
    
    void main(){
        HuffmanTree HT;
        HuffmanCode HC;
        int n;
        cout<<"please input the number of leaf child:
    ";
        CreateHuffmanTree(HT,n);
        CreateHuffmanCode(HT,HC,n);
        show(HT,HC);
    }
    
  • 相关阅读:
    每日一题_190921
    每日一题_190920
    每日一题_190919
    2017年江苏高考数学14题
    2017年全国高中数学联赛及2017年贵州省预赛试题
    高中数学与初中数学的接轨点
    从此错位(相减)无计算
    在 LaTeX 中同步缩放 TikZ 与其中的 node
    析构函数 一定是虚函数
    Java对多线程的支持
  • 原文地址:https://www.cnblogs.com/ygjzs/p/11874616.html
Copyright © 2011-2022 走看看