我的程序假设从文件中读取字符并显示文件中内容的预订,按顺序和后序遍历。问题是它只显示文件中一半的内容。不确定它从文件中停止读取的位置和原因?
#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
答案 0 :(得分:1)
其实......我想我看到了问题。代码看起来运行得很好,我认为输入文件是错误的。
鉴于此输入:C E F @ @ H @ @ B @ @ G A @ @ N J @ @ K @ @
,代码执行如下:
bt.root = buildTree(in);
fscanf(in, "%s", str); //finds C
p -> left = buildTree(in);
fscanf(in, "%s", str); //finds E
p -> left = buildTree(in);
fscanf(in, "%s", str); //finds F
p -> left = buildTree(in);
fscanf(in, "%s", str); //finds @
p -> right = buildTree(in);
fscanf(in, "%s", str); //finds @
p -> right = buildTree(in);
fscanf(in, "%s", str); //finds H
p -> left = buildTree(in);
fscanf(in, "%s", str); //finds @
p -> right = buildTree(in);
fscanf(in, "%s", str); //finds @
p -> right = buildTree(in);
fscanf(in, "%s", str); //finds B
p -> left = buildTree(in);
fscanf(in, "%s", str); //finds @
p -> right = buildTree(in);
fscanf(in, "%s", str); //finds @
此时,每个节点都有两个子节点,因此执行停止,将G A @ @ N J @ @ K @ @
剩余留在输入缓冲区中。
读入的树位于左侧。如果剩余的被重新分析,它也会形成一棵树,如右图所示。
C G
E B A N
F H @ @ @ @ J K
@ @ @ @ @ @ @ @
我不确定您打算读什么树,但输入可能缺少根节点?
话虽这么说,buildTree
例程中至少有一个错误,但你没有遇到它。尝试使用此输入:&#34; A
&#34;,然后您就会找到它:D
答案 1 :(得分:0)
查看buildTree方法。
您正在使用这些规则实现一个简单的语法....
Node -> char Node Node
Node -> @
尝试使用这些规则手动解析字符串。所以,开始...
Input -> C LeftNode RightNode
LeftNode -> E LeftNode RightNode
LeftNode -> F LeftNode RightNode
LeftNode -> @
RightNode -> @
RightNode -> ...
等等。
语法是一种先进的概念(通常在大学的第三年教授),但它是理解buildTree等方法的必要模型。
PS,除了理解buildTree如何工作之外,你应该真正用它正在实现的语法定义来评论它。记录下来可以节省大量工作。