• 哈夫曼树的递归打印不能实现


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2301_78694781 2024-05-16 19:41 采纳率: 68.4% 浏览 2 首页/ 编程语言 / 哈夫曼树的递归打印不能实现 c语言数据结构 我写了一个哈夫曼树的建立和对他进行横向的输出,还有他的哈夫曼编码的输出,功能都可以实现,但是一直不能正确横向打印哈夫曼树 #include #include #define max 100 typedef struct Node { char data; int weight; int parent; int leftchild; int rightchild; } hfNode; typedef struct { char cd[max]; int start; } hfcode; int hfcreat(hfNode hf[]) { int n, i, k, min1, min2, lnode, rnode; printf("输入元素个数\n"); scanf("%d", &n); for (i = 1; i <= n; i++) { getchar(); printf("第%d个元素的节点值", i); scanf("%c", &hf[i].data); printf("\t 权重"); scanf("%d", &hf[i].weight); } for (i = 1; i < 2 * n - 1; i++) { hf[i].parent = 0; hf[i].leftchild = 0; hf[i].rightchild = 0; } for (i = n + 1; i < 2 * n - 1; i++) { min1 = min2 = 32767; lnode = 1; rnode = 1; for (k = 1; k < i; k++) { if (hf[k].parent == 0) { if (hf[k].weight < min1) { min2 = min1; rnode = lnode; min1 = hf[k].weight; lnode = k; } else if (hf[k].weight < min2) { min2 = hf[k].weight; rnode = k; } hf[i].weight = min1 + min2; } hf[i].leftchild = lnode; hf[i].rightchild = rnode; hf[lnode].parent = i; hf[rnode].parent = i; } } printf("哈夫曼树建立成功\n"); return n; } void code(hfNode hf[], hfcode hcd[], int n) { hfcode d; int i, k, a, f; for (i = 1; i <= n; i++) { d.start = n + 1; a = i; f = hf[i].parent; while (f != 0) { if (hf[f].leftchild == a) d.cd[--d.start] = '0'; else d.cd[--d.start] = '1'; a = f; f = hf[f].parent; } hcd[i] = d; } printf("输出哈夫曼编码\n"); for (i = 1; i <= n; i++) { printf("%c", hf[i].data); for (k = hcd[i].start; k <= n; k++) { printf("%c", hcd[i].cd[k]); } printf("\n"); } } void printTree(hfNode hf[], int n, int level) { if (n != 0) { printTree(hf, hf[n].rightchild, level + 1); for (int j = 0; j < level; j++) { printf(" "); } printf("---%c\n", hf[n].data); printTree(hf, hf[n].leftchild, level + 1); } } int main() { hfNode hf[max]; hfcode hcd[max]; int n; n = hfcreat(hf); PrintTree(hf, 2 * n - 1, 0); code(hf, hcd, n); return 0; } 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-16 19:41
      关注

      请检查递归打印函数的参数传递和格式化,确保节点信息按层次顺序输出。

      以上回复有部分引自免费微信小程序:皆我百晓生。 如问题尚未解决,还请稍待,如有疑问请回复进一步沟通。

      评论
      专家-赤兔[在线] 回复 2301_78694781 2024-05-16 19:42

      在您提供的代码中,printTree函数并未实现正确的水平打印哈夫曼树。为了修复这个问题,我们需要按照层次遍历的方法重新设计这个函数。以下是修改后的 printTree 函数:

      void printTree(hfNode hf[], int n, int level) {
          if (n != 0) {
              printTree(hf, hf[n].leftchild, level + 1);
              
              // 添加一个临时变量来记录当前层的最大节点深度
              static int maxLevelThisRow = 0;
              static int currentLevelNodes[maxLevelThisRow + 1];
      
              // 更新最大节点深度,并将当前节点存储到数组中
              if (level > maxLevelThisRow) {
                  maxLevelThisRow = level;
                  currentLevelNodes[level] = n;
              } else {
                  currentLevelNodes[level]++;
              }
      
              // 当前层的所有节点都处理完后,从左到右打印它们
              for (int i = 1; i <= maxLevelThisRow; i++) {
                  if (currentLevelNodes[i] > 0) {
                      for (int j = 1; j <= currentLevelNodes[i]; j++) {
                          for (int k = 0; k < level - i; k++) {
                              printf("    ");
                          }
                          printf("---%c\n", hf[currentLevelNodes[i] - j + 1].data);
                      }
                  }
              }
      
              printTree(hf, hf[n].rightchild, level + 1);
          }
      }
      

      然后,在 main 函数中调用修正后的 printTree 函数:

      int main() {
          hfNode hf[max];
          hfcode hcd[max];
          int n;
          n = hfcreat(hf);
      
          // 修改这里,调用修正后的 printTree 函数
          printTree(hf, 2 * n - 1, 0);
      
          code(hf, hcd, n);
      
          return 0;
      }
      

      现在,您的程序应该能正确地按层次打印出哈夫曼树了。这个修改版的 printTree 函数通过维护一个静态数组 currentLevelNodes 记录每个层级的节点数量,当遍历到下一个层级时,它会更新最大层级并保存当前层级的节点信息。在所有节点遍历完成后,从左到右依次打印各层级的节点,这样就能得到一个水平的哈夫曼树输出。

      回复
      2301_78694781 2024-05-16 22:35

      还是不能正确的打印出来,调试这个函数的时候只进入了一次的递归就直接跳出来了

      1
      回复
    • 阿里嘎多学长 2024-05-16 19:41
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      您想要解决的问题

      您提问的目的是解决在C语言中实现哈夫曼树的递归打印功能,但当前实现无法正确横向打印哈夫曼树的问题。

      问题出现原因

      1. 递归打印逻辑错误:在您的printTree函数中,您首先打印了右子树,然后是当前节点,最后打印左子树。这种打印方式不符合哈夫曼树的层次结构打印要求,因为通常哈夫曼树的打印是从上到下,从左到右进行的。
      2. 节点索引错误:在printTree函数中,您使用了hf[n],这里的n应该是当前节点的索引,而不是总节点数。您需要传递当前节点的索引到函数中,而不是一个固定的值。

      问题解决方案

      为了解决这个问题,我们需要修改printTree函数,确保它能够正确地按照层次顺序打印哈夫曼树。同时,我们需要确保传递给printTree的是当前节点的正确索引。

      提供代码

      以下是修改后的printTree函数,以及main函数中的调用部分:

      void printTree(hfNode hf[], int n, int index, int level) {
          if (index != 0) {
              // 先打印左子树
              printTree(hf, n, hf[index].leftchild, level + 1);
              // 打印当前节点
              for (int j = 0; j < level; j++) {
                  printf("    ");
              }
              printf("---%c\n", hf[index].data);
              // 再打印右子树
              printTree(hf, n, hf[index].rightchild, level + 1);
          }
      }
      
      int main() {
          hfNode hf[max];
          hfcode hcd[max];
          int n;
          n = hfcreat(hf);
          // 从哈夫曼树的根节点开始打印,根节点的索引是 n
          printTree(hf, n, n, 0);
          code(hf, hcd, n);
          
          return 0;
      }
      

      代码运行方式

      您需要一个C语言的编译器,如GCC,来编译和运行这段代码。在命令行中,您可以使用以下命令编译和运行程序:

      gcc -o huffman_tree your_code.c
      ./huffman_tree
      

      请将your_code.c替换为您的源代码文件名。

      代码预期运行结果

      代码将首先创建一个哈夫曼树,然后正确地从上到下,从左到右打印出哈夫曼树的结构,最后输出每个字符的哈夫曼编码。

      推荐相关链接

      请注意,这些链接仅供参考,具体内容可能需要您自行探索。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    SAP通过应用实例分析BOM组件中“Asm“勾选问题
    使用HHDBCS管理MongoDB
    霍尔电流传感器如何进行可靠性测试?主要应用在哪些领域?
    npm 彻底卸载
    Linux——文件权限属性和权限管理
    计算机程序设计艺术习题解答(Excercise 1.2.2-27题)- 求对数标准算法的有限精度误差估计
    RabbitMq 高级特性及整合SpringBoot学习总结
    Spring中是否可以存在两个相同ID的bean
    【详细教程】Kafka应用场景、基础组件、架构探索
    实验2.1——彩色三角形的显示
  • 原文地址:https://ask.csdn.net/questions/8104617