请检查递归打印函数的参数传递和格式化,确保节点信息按层次顺序输出。
以上回复有部分引自免费微信小程序:皆我百晓生。 如问题尚未解决,还请稍待,如有疑问请回复进一步沟通。
在您提供的代码中,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
记录每个层级的节点数量,当遍历到下一个层级时,它会更新最大层级并保存当前层级的节点信息。在所有节点遍历完成后,从左到右依次打印各层级的节点,这样就能得到一个水平的哈夫曼树输出。
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
您提问的目的是解决在C语言中实现哈夫曼树的递归打印功能,但当前实现无法正确横向打印哈夫曼树的问题。
printTree
函数中,您首先打印了右子树,然后是当前节点,最后打印左子树。这种打印方式不符合哈夫曼树的层次结构打印要求,因为通常哈夫曼树的打印是从上到下,从左到右进行的。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
替换为您的源代码文件名。
代码将首先创建一个哈夫曼树,然后正确地从上到下,从左到右打印出哈夫曼树的结构,最后输出每个字符的哈夫曼编码。
请注意,这些链接仅供参考,具体内容可能需要您自行探索。