ここでは新しいですが、私は小さな助けをしたいと思います。私は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を呼び出すことができますが、あなたはファイルを閉じ、ツリーの最初のセクションのための左右のトラバースて末端いったんれ
ようこそスタックオーバーフロー!デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver