• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 解读赫夫曼树编码的问题

解读赫夫曼树编码的问题

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了赫夫曼树编码和译码,赫夫曼树编码,赫夫曼树和赫夫曼编码,赫夫曼编码,赫夫曼编码实验报告等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

定义:

  结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。假设有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只含一棵树为止。这棵树便是赫夫曼树。

代码实现:

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;
}
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 解读赫夫曼树编码的问题

相关文章

  • 2017-05-28C#编程获取实体类属性名和值的方法示例
  • 2017-05-28深入C#判断操作系统类型的总结详解
  • 2017-05-28C#微信公众号开发 微信事件交互
  • 2017-05-28C# 调用API函数弹出映射网络驱动器对话框问题
  • 2017-05-28解析C#的扩展方法
  • 2017-05-28des加密解密源码 C# key值问题分析
  • 2017-05-28C#采用OpenXml给Word文档添加表格
  • 2017-05-28Winform窗体圆角设计代码
  • 2017-05-28C#使用SqlDataAdapter对象获取数据的方法
  • 2017-05-28C#中构造函数和析构函数用法实例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 总结C#删除字符串数组中空字符串的几种方法
    • c# 文件(夹)创建与删除
    • 详细解析C#多线程同步事件及等待句柄
    • C#多线程处理多个队列数据的方法
    • 日常收集C#接口知识(知识全面)
    • C#正则表达式Regex类用法实例分析
    • C#判断一个矩阵是否为对称矩阵及反称矩阵的方法
    • C#读取csv格式文件的方法
    • 一个读写csv文件的C#类
    • 举例讲解C#中自动实现的属性

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有