从文件重建树

时间:2018-02-11 13:56:33

标签: c++ binary-tree

我正在使用C ++编写一个程序来重建文件中的二叉树。

除了它正在做的事情之外,我的程序还应该能够从文件中读取十六进制数字。 此外,指示节点没有子节点的标记是-1,我希望它是一个字符(例如#),但是我没有取得多大成功。

有人可以帮我解决这两个问题(从文件中读取十六进制数并用#替换-1作为标记吗?)。

#include <stdio.h>
#define MARKER -1

struct Node
{
    int key;
    struct Node* left, *right;
};

Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}

void deSerialize(Node *&root, FILE *fp)
{

    int val;
    if ( !fscanf(fp, "%d ", &val) || val == MARKER)
       return;

    root = newNode(val);
    deSerialize(root->left, fp);
    deSerialize(root->right, fp);
}

void preorder(Node *root)
{
    if (root)
    {
        printf("%d ", root->key);
        preorder(root->left);
        preorder(root->right);
    }
}

int main()
{
    Node *root1 = NULL;
    FILE *fp = fopen("tree.txt", "r");
    deSerialize(root1, fp);

    printf("preorder Traversal of the tree constructed from file:\n");
    preorder(root1);

    return 0;
}

例如,如果文件包含1 2 4 -1 -1 5 -1 -1 3 -1 -1,则会显示1 2 4 5 3

谢谢!

1 个答案:

答案 0 :(得分:2)

为什么不使用ifsteam代替FILE
为什么不使用cout#include <iostream>)代替printf()? 有关阅读十六进制数字的信息,请参阅thisifstream为{,而不是FILE)。

现在关于#而不是-1 只需将第一个字符读为char,然后检查它是否为#