【发布时间】:2014-07-23 17:21:24
【问题描述】:
我的程序假设从文件中读取字符并显示文件中内容的前序、中序和后序遍历。问题是它只显示文件中一半的内容。不确定它在哪里以及为什么停止从文件中读取?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MaxWordSize 50
typedef struct {
char word[MaxWordSize + 1];
}NodeData;
typedef struct treeNode {
NodeData data;
struct treeNode *left, *right;
}TreeNode, *TreeNodePtr;
typedef struct {
TreeNodePtr root;
}BinaryTree;
void visit(TreeNodePtr node) {
printf("%s", node -> data.word);
}//end visit
void preOrder(TreeNodePtr node) {
void visit(TreeNodePtr);
if (node != NULL) {
visit(node);
preOrder(node -> left);
preOrder(node -> right);
}
}
void inOrder(TreeNodePtr node) {
void visit(TreeNodePtr);
if (node != NULL) {
inOrder(node -> left);
visit(node);
inOrder(node -> right);
}
}
void postOrder(TreeNodePtr node) {
void visit(TreeNodePtr);
if (node != NULL) {
postOrder(node -> left);
postOrder(node -> right);
visit(node);
}
}
TreeNodePtr buildTree(FILE *in) {
char str[MaxWordSize + 1];
fscanf(in, "%s", str);
if (strcmp(str, "@") == 0) {
return NULL;
}
TreeNodePtr p = (TreeNodePtr)malloc(sizeof(TreeNode));
strcpy(p -> data.word, str);
p -> left = buildTree(in);
p -> right = buildTree(in);
return p;
}
int main() {
TreeNodePtr buildTree(FILE *);
void preOrder(TreeNodePtr);
void inOrder(TreeNodePtr);
void postOrder(TreeNodePtr);
FILE *in = fopen("./c/btree.in.txt", "r");
BinaryTree bt;
bt.root = buildTree(in);
printf("\n The pre-order traversal is : ");
preOrder(bt.root);
printf("\n The in-order traversal is : ");
inOrder(bt.root);
printf("\n The post-order traversal is : ");
postOrder(bt.root);
printf("\n\n");
fclose(in);
system ("PAUSE");
return 0;
}
我的输入文件内容是:
C E F @ @ H @ @ B @ @ G A @ @ N J @ @ K @ @
我的输出是:
The pre-order traversal is: CEFHB
The in-order traversal is: FEHCB
The post-order traversal is: FHEBC
【问题讨论】:
-
你应该做一些调试来找出问题所在的函数。然后为那个方法构建一个minimal test-case。
-
其实....我想我看到了问题所在。该代码似乎运行完美,我认为 输入文件 是错误的。输入文件形成了树
C (E (F H)) (B),这是一棵有效的树,因此其余部分被忽略:G A @ @ N J @ @ K @ @ -
你能添加一张输入文件应该代表什么树的图表吗?
-
@MooingDuck 你完全正确!谢谢!
-
问题是对'@'(和返回)的检查经常发生,以至于在处理'B'后立即退出递归。所以逻辑是错误的。也许添加一个递归计数器,如果该计数器指示递归的顶层,则仅在文件末尾返回,否则读取另一个输入并继续。
标签: c binary-tree traversal inorder postorder