2017-05-05 6 views
0

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:

Compiler_result

+0

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

Antwort

0

Sie rufen treeToFile mit einem Knoten Argument recurisvely aber wenn man für den ersten Abschnitt des Baumes schließen Sie die Datei links und rechten Ende überquert. Von dort drückst du den if-Zweig, der sagt, dass die Datei nicht geöffnet werden kann. Sie sollten die Datei am Ende des Speicherns schließen, möglicherweise verschieben Sie den close to treeToFile, indem Sie ostream nicht den Knoten und ostream überladen.

Auch Sie kehren zu einem Funktionsaufruf zurück, der void zurückgibt, das nur unnötig ist.

+0

Vielen Dank, Sie haben mir wirklich geholfen! !! –