我写了一个哈夫曼树的建立和对他进行横向的输出,还有他的哈夫曼编码的输出,功能都可以实现,但是一直不能正确横向打印哈夫曼树
#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;
}