使用类的C ++二叉树序列化

时间:2017-05-05 16:19:34

标签: c++ serialization tree

我是新来的,我想要一个小帮助。我正在用C ++(使用类)完成我的作业,其中包括将文件串行化二进制搜索树和文件反序列化。我卡住了。

我已经编写了二进制搜索树和一些有用的方法以供日后使用。但是我将二进制搜索树序列化为文件存在问题。感谢所有帮助,建议和想法!!!

我的代码:

Tree.h:

#include <fstream> 
using namespace std;

class BinaryTree
{
public:
    BinaryTree();
    ~BinaryTree();

    void Insert(int x);
    void InOrder();
    bool Search(int x);
    void treeToFile(ofstream& file);

private:
    struct node
    {   
        int key;
        node* left;
        node* right;
    };
    node* root;
    void Clear(node* nod);
    void Insert(int x, node*& nod);
    void InOrder(node* nod);
    bool Search(int x, node* nod);
    void treeToFile(node* nod, ofstream& file);
};

Tree.cpp:

#include "Tree.h"
#include<iostream>
#include<fstream>

using namespace std;

BinaryTree::BinaryTree()
{
    root = nullptr;
}

BinaryTree:: ~BinaryTree()
{
    cout << "Clear Binary Tree" << endl;
    Clear(root);
}

void BinaryTree::Clear(node* nod)
{
    if (nod != nullptr)
    {
        Clear(nod->left); 
        Clear(nod->right);
        cout <<"Deleting node: " <<nod->key << endl;
        delete nod;
    }
}

void BinaryTree::Insert(int x)
{
    Insert(x, root);
}

void BinaryTree::Insert(int x, node*& nod)
{
    if (nod == nullptr) 
    {
        nod = new node();
        nod->left = nullptr;
        nod->right = nullptr;
        nod->key = x;
    }
    else
        if (x<nod->key) 
            Insert(x, nod->left);
        else
            if (x>nod->key) 
                Insert(x, nod->right);
}

bool BinaryTree::Search(int x)
{
    return Search(x, root);
}

void BinaryTree::treeToFile(ofstream & file)
{
    return treeToFile(root, file);
}

bool BinaryTree::Search(int x, node* nod)
{
    if (nod == nullptr)
        return false;

    if (nod->key == x)
        return true;

    if (x<nod->key)
        Search(x, nod->left);
    else
        if (x>nod->key)
            Search(x, nod->right);
}

void BinaryTree::InOrder()
{
    cout << "Inorder traversal:" << endl;
    InOrder(root);
}

void BinaryTree::InOrder(node* nod)
{
    if (nod != nullptr)
    {
        InOrder(nod->left);
        cout <<"Node with key: "<<nod->key <<endl;
        InOrder(nod->right);
    }
}
void BinaryTree::treeToFile(node* root, ofstream& file)
{   
    if (!file.is_open()){
        cout << "File cannot be opened" << endl;
    }
    if (root == NULL) {
        file << "#" << ";";
        return;
    }
    file << root->key << ';';
    treeToFile(root->left, file);
    treeToFile(root->right, file);
    file.close();

}

主。 CPP

#include "Tree.h"
#include<iostream>
#include<string>

using namespace std;

int main()
{
    BinaryTree* tree = new BinaryTree();
    tree->Insert(4);
    tree->Insert(42);
    tree->Insert(21);
    tree->Insert(31);
    tree->Insert(14);
    tree->Insert(12);
    tree->Insert(3);
    ofstream output("tree.txt");
    tree->treeToFile(output);


    delete tree;
    return 0;
}

序列化文件的内容,当我尝试编译它时:4; 3;#;#;

对于序列化我按照老师的指示使用前序遍历。但是当我试图在文件中存储树的点头时 - 它只存储左子树,而在编译器中它表示文件无法打开。

编译器显示:

Compiler_result

1 个答案:

答案 0 :(得分:0)

您正在使用节点参数重新调用treeToFile,但是一旦您结束左侧和右侧遍历树的第一部分,您就会关闭文件。从那里你点击if分支说文件无法打开。你应该在保存的最后关闭文件,可能会将close关闭到treeToFile,而不是节点和ostream超载的ostream。

此外,您还会返回一个函数调用,该函数调用返回的空格只是不必要的。