Ich bin neu hier und ich möchte eine kleine Hilfe. Ich mache meine Hausaufgaben in C++ (unter Verwendung von Klassen), die Serialisierung binäre Suchbaum in Datei und Deserialisierung von Datei enthält. Ich blieb stecken.C++ Binary Tree Serialisierung mit Klassen
Ich habe den binären Suchbaum und einige nützliche Methoden für später programmiert. Aber ich habe Probleme mit der Serialisierung des binären Suchbaums in eine Datei. Danke für alle Hilfe, Ratschläge und Ideen !!!
Mein Code:
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();
}
Main. 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;
}
Inhalt der serialisierten Datei, als ich versuchte, es zu kompilieren: 4; 3; #; #;
Für die Serialisierung verwende ich Preorder Traversal wie mein Lehrer angewiesen. Aber als ich versuchte, das Nicken des Baumes in der Datei zu speichern - es speichert nur den linken Teilbaum, und im Compiler heißt es, dass die Datei nicht geöffnet werden kann.
Compiler zeigt dies:
Willkommen bei Stack Overflow! Es klingt, als müssten Sie lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver