国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

解讀赫夫曼樹編碼的問題

2020-01-24 03:22:29
字體:
來源:轉載
供稿:網友

定義:

  結點的帶權路徑長度為從該結點到樹根之間的路徑長度與結點上權的乘積。樹的帶權路徑長度為樹中所有葉子結點的帶權路徑長度之和。假設有n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi,則其中帶權路徑長度最小的二叉樹稱做最優二叉樹或赫夫曼樹。

 構造赫夫曼樹的方法: 

(1)根據給定的n個權值{w1,w2,w3......}構成n棵二叉樹的集合F={T1,T2,T3,T4......},其中每棵二叉樹Ti中只有一個帶權為wi的根結點,其左右子樹均空。

(2)在F中選取兩棵根結點的權值最小的樹作為左右子樹構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值之和。

(3)在F中刪除這兩棵樹,同時將新得到的二叉樹加入F中。

(4)重復(2)和(3),直到F只含一棵樹為止。這棵樹便是赫夫曼樹。

代碼實現:

復制代碼 代碼如下:

#include<iostream>
#include<assert.h>
using namespace std;

struct HuffmanNode
{
    unsigned int weight;
    unsigned int parent,leftChild,rightChild;
    HuffmanNode()
    {
        weight=0;parent=0;leftChild=0;rightChild=0;
    }
};

void Select(const HuffmanNode* & nodelist,const int length,int & a, int &b)
{
    int min=1000000,min2=1000000;
    for(int i=0;i<length;i++)
    {
        if(min>nodelist[i].weight&&nodelist[i].parent==0)
        {
            min=nodelist[i].weight;
            a=i;
        }
    }
    for(int j=0;j<length;j++)
    {
        if(j!=a&&min2>nodelist[j].weight&&nodelist[j].parent==0)
        {
            min2=nodelist[j].weight;
            b=j;
        }
    }
}

char ** HuffmanCoding(const int *w, const int n)
{
    assert(w!=NULL);
    int i,min1,min2;
    int m = 2*n-1;
    HuffmanNode * nodelist = new HuffmanNode[m]();
    for(i=0;i<n;i++)
    {
        nodelist[i].weight=w[i];
        nodelist[i].parent=0;
    }
    for(i=n;i<m;i++)
    {
        Select(nodelist,i,min1,min2);
        nodelist[min1].parent=i;
        nodelist[min2].parent=i;
        nodelist[i].weight=nodelist[min1].weight+nodelist[min2].weight;
        nodelist[i].rightChild=min2;
        nodelist[i].leftChild=min1;
        nodelist[i].parent=0;
    }
    char temp [20];
    char ** code = new char * [n];
    for(i=0;i<n;i++)
    {
        int j=i;
        int index=0;
        while(j!=m-1)
        {
            if(j==nodelist[nodelist[j].parent].leftChild) temp[index++]='0';
            else temp[index++]='1';
            j=nodelist[j].parent;
        }
        temp[index]='/0';
        code[i] = new char[index+1];
        strcpy(code[i],temp);
    }
    delete nodelist;
    return code;
}

int main()
{
    const int size=6;
    char word[size]={'A','B','C','D','E','F'};//編碼字符
    int w[size]={4,3,2,1,7,8};//權重
    char ** code;
    code=HuffmanCoding(w,size);
    assert(code!=NULL);
    for(int i=0;i<size;i++)
    {
        cout<<word[i]<<" is coded as "<<code[i]<<endl;
    }
    //注意二級指針的釋放問題
    for(int j=0;j<size;j++)
    {
        delete []code[j];
    }
    delete []code;
    return 0;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 布拖县| 安仁县| 嵊州市| 义乌市| 台山市| 龙游县| 枝江市| 阆中市| 平潭县| 进贤县| 乳山市| 鲁甸县| SHOW| 东乌| 庆阳市| 班戈县| 南川市| 进贤县| 苍梧县| 湄潭县| 鄱阳县| 墨玉县| 蓬溪县| 玛多县| 中超| 罗江县| 长兴县| 鄂州市| 双流县| 神农架林区| 宁陕县| 邹城市| 蒙自县| 九龙坡区| 财经| 马山县| 米泉市| 稷山县| 喀喇沁旗| 平潭县| 海盐县|