zoukankan      html  css  js  c++  java
  • DS二叉树--Huffman编码与解码

    题目描述

    1、问题描述

    给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码。

    构造Huffman树时,要求左子树根的权值小于、等于右子树根的权值。

    进行Huffman编码时,假定Huffman树的左分支上编码为‘0’,右分支上编码为‘1’

    2、算法

    构造Huffman树算法:

    根据给定的n个权值(w1, w2, …, wn)构成n棵二叉树的集合F={T1, T2, …, Tn},其中每棵二叉树Ti中只有一个权值为wi的根结点。

    F中选取两棵根结点的权值最小的树,作为左、右子树构造一棵新的二叉树,且置其根结点的权值为其左、右子树权值之和。

    F中删除这两棵树,同时将新得到的二叉树加入F中。

    (4)重复, ,直到F只含一棵树为止。

    3Huffman编码算法:

    Huffman树的每一个叶子结点开始。

    依次沿结点到根的路径,判断该结点是父亲结点的左孩子还是右孩子,如果是左孩子则得到编码‘0’,否则得到编码‘1’,先得到的编码放在后面。

    直到到达根结点,编码序列即为该叶子结点对应的Huffman编码。

    4Huffman译(解)码算法:

    指针指向Huffman树的根结点,取第一个Huffman码。

    如果Huffman码为‘0’,将指针指向当前结点的左子树的根结点;如果Huffman码为‘1’,将指针指向当前结点的右子树的根结点。

    如果指针指向的当前结点为叶子结点,则输出叶子结点对应的字符;否则,取下一个Huffman码,并返回

    如果Huffman码序列未结束,则返回继续译码。

    输入

    第一行测试次数

    2行:第一组测试数据的字符个数n,后跟n个字符

    3行:第一组测试数据的字符权重

    待编码的字符串s1

    编码串s2

    其它组测试数据类推

    输出

    第一行~n,第一组测试数据各字符编码值

    n+1行,串s1的编码值

    n+2行,串s2的解码值,若解码不成功,输出error!

    其它组测试数据类推

    样例输入

    2
    5 A B C D E
    15 4 4 3 2
    ABDEC
    00000101100
    4 A B C D
    7 5 2 4
    ABAD
    1110110

    样例输出

    A :1
    B :010
    C :011
    D :001
    E :000
    1010001000011
    error!
    A :0
    B :10
    C :110
    D :111
    0100111
    DAC
     
     
     
     
     
     
     
     
  • 相关阅读:
    TSQL查询进阶深入理解子查询
    CodeSmith和PowerDesigner的安装和数据库创建
    Inten对象中的Flag
    JNI配置问题
    Android技巧篇
    onSaveInstanceState状态问题
    Android MMSTransactionService
    Android MMS
    AcctivityManager
    隐藏键盘
  • 原文地址:https://www.cnblogs.com/Liu269393/p/10220853.html
Copyright © 2011-2022 走看看