2017-05-05 5 views
0

ここでは新しいですが、私は小さな助けをしたいと思います。私はC + +で(クラスを使用して)自分の宿題をやっています。これには、直列化バイナリ検索ツリーがファイルに含まれ、ファイルから直列化復元されます。私は立ち往生した。クラスを使用した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;#;#;

シリアル化については、先生が教えてくれたように、私は予約オーダートラバーサルを使用しています。しかし、私は木の節をファイルに保存しようとしました - それは左のサブツリーだけを保存し、コンパイラはファイルを開くことができないと言います。あなたはrecurisvelyノード引数でtreeToFileを呼び出すことができますが、あなたはファイルを閉じ、ツリーの最初のセクションのための左右のトラバースて末端いったんれ

Compiler_result

+0

ようこそスタックオーバーフロー!デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

答えて

0

コンパイラはこれを示しています。そこからファイルを開くことができないと言うブランチにヒットしました。保存の最後にファイルを閉じ、treeToFileの近くをostreamノードとostreamオーバーロードではなく移動させてください。

また、単に不要なvoidを返す関数呼び出しに戻ります。

+0

ありがとう、本当に助けてくれました! !! –

関連する問題