二叉树仅显示一半内容

时间:2014-07-23 17:21:24

标签: c binary-tree traversal inorder postorder

我的程序假设从文件中读取字符并显示文件中内容的预订,按顺序和后序遍历。问题是它只显示文件中一半的内容。不确定它从文件中停止读取的位置和原因?

#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

2 个答案:

答案 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如何工作之外,你应该真正用它正在实现的语法定义来评论它。记录下来可以节省大量工作。