2301_78694781 2024-05-16 19:41 采纳率: 91.7%
浏览 2
已结题

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

我写了一个哈夫曼树的建立和对他进行横向的输出,还有他的哈夫曼编码的输出,功能都可以实现,但是一直不能正确横向打印哈夫曼树


#include <stdio.h>
#include <stdlib.h>

#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;
}

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-16 19:41
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月28日
  • 已采纳回答 8月20日
  • 创建了问题 5月16日