• 【数据结构】【程序填空】赫夫曼解码


    目录

    题目描述

    思路分析

    AC代码


    题目描述

    在掌握赫夫曼树构建的基础上,实现赫夫曼解码

    赫夫曼构建中,默认左孩子权值不大于右孩子权值

    如果遇到两个孩子权值相等,那么按输入顺序或生成顺序来排列。

    例如有一个叶子权值是29,后来生成一个中间结点权值也是29,那么叶子为左孩子,中间结点为右孩子

    例如有两个叶子权值都是4,那么按输入顺序,先输入权值的叶子是左孩子

    请完成以下程序填空

    输入

    第一行输入n,表示有n个叶子

    第二行输入n个叶子权值,权值全是正整数

    第三行输入n个叶子对应的字符,权值全是正整数

    第四行输入k,表示要输入k个编码串

    接着输入k个编码串

    输出

    输出k行,每行输出一个编码串的解码结果。

    如果编码串非法,则对应的一行输出error,不输出已解码的字符

    输入样例1

    5
    15 4 4 3 2
    K G C M W
    2
    11011010000001
    0000011100010

    输出样例1

    KKCGWM
    error

    思路分析

    遍历编码,从树的根节点开始找,如果当前字符是0,判断是否有左孩子,有的话,更新节点为左孩子节点,如果没有,退出输出error。如果当前字符是1,判断是否有有孩子,有的话,更新节点为右孩子节点,如果没有,退出输出error。

    如果左右孩子都为0,说明到达叶子节点,尾部添加解码信息。

    注意string类对象可直接通过+=实现尾部添加字符(串)。

    AC代码

    1. HuffMan::HuffMan(int n, int *w,char c[]) {
    2. lnum = n;
    3. len = lnum * 2 - 1;
    4. HuffTree = new HuffNode[len+1];
    5. for (int i = 1; i <= lnum; i++) {
    6. HuffTree[i].weight = w[i-1];
    7. HuffTree[i].letter=c[i-1];
    8. HuffTree[i].parent = HuffTree[i].lchild = HuffTree[i].rchild = 0;
    9. }
    10. for (int i = lnum+1; i <= len; i++)
    11. HuffTree[i].weight = HuffTree[i].parent = HuffTree[i].lchild = HuffTree[i].rchild = 0;
    12. }
    13. void HuffMan::buildTree() {
    14. int a, b;
    15. for (int i = lnum+1; i <= len; i++) {
    16. selectMin(i-1, a, b);
    17. HuffTree[a].parent = HuffTree[b].parent = i;
    18. HuffTree[i].lchild = a;
    19. HuffTree[i].rchild = b;
    20. HuffTree[i].weight = HuffTree[a].weight + HuffTree[b].weight;
    21. }
    22. }
    23. void HuffMan::selectMin(int n, int &x1, int &x2) {
    24. x1=x2=0;
    25. for (int i =1; i <= n; i++)
    26. if (HuffTree[i].parent == 0) {
    27. if(x1==0)
    28. x1=i;
    29. else if(x2==0)
    30. x2=i;
    31. if (HuffTree[i].weight < HuffTree[x1].weight) {
    32. x2 = x1;
    33. x1 = i;
    34. } else if (x2 != 0 && HuffTree[i].weight < HuffTree[x2].weight)
    35. x2 = i;
    36. }
    37. }
    38. void HuffMan::Decoding(std::string cs) {
    39. int j=len;
    40. string temp;
    41. for (int i = 0;cs[i]; i++) {
    42. if(cs[i]=='0'){
    43. if(HuffTree[j].lchild)
    44. j=HuffTree[j].lchild;
    45. else{
    46. cout<<"error"<
    47. return;
    48. }
    49. }else{
    50. if(HuffTree[j].rchild)
    51. j=HuffTree[j].rchild;
    52. else{
    53. cout<<"error"<
    54. return;
    55. }
    56. }
    57. if (HuffTree[j].lchild == 0 && HuffTree[j].rchild == 0) {
    58. temp+=HuffTree[j].letter;
    59. j = len;
    60. }
    61. }
    62. if(j==len)
    63. cout<
    64. else
    65. cout<<"error"<
    66. }
    67. HuffMan::~HuffMan() {
    68. if (HuffTree)
    69. delete[]HuffTree;
    70. }
  • 相关阅读:
    2024牛客寒假算法基础集训营6
    未来3-5年最大的风口是什么?
    应用于供暖、供水管道等场景的一种智能控制阀
    bash: /usr/bin/cmake: No such file or directory
    Spring Bean继承的简介说明
    高通导航器软件开发包使用指南(13)
    肝了4天,终于把Vue3编译原理之transform憋出来了
    从零开始做一款Unity3D游戏<三>——编写游戏机制
    【LeetCode】Day147-找到字符串中所有字母异位词
    Go语言的流程控制
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/127649765