我是新来的,我想要一个小帮助。我正在用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;#;#;
对于序列化我按照老师的指示使用前序遍历。但是当我试图在文件中存储树的点头时 - 它只存储左子树,而在编译器中它表示文件无法打开。
编译器显示:
答案 0 :(得分:0)
您正在使用节点参数重新调用treeToFile,但是一旦您结束左侧和右侧遍历树的第一部分,您就会关闭文件。从那里你点击if分支说文件无法打开。你应该在保存的最后关闭文件,可能会将close关闭到treeToFile,而不是节点和ostream超载的ostream。
此外,您还会返回一个函数调用,该函数调用返回的空格只是不必要的。