• 根据赫夫曼树求赫夫曼编码


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

    //根据赫夫曼树求赫夫曼编码
    #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);
    }
    
  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/ygjzs/p/11874616.html
Copyright © 2020-2023  润新知