Здравствуйте! Есть дерево, которое построена по принципу left child - right sibling. Как можно сделать так, чтобы данные (child, sibling and parent) записывался в файл?
Код:
#include <iostream>
#include <fstream>
using namespace std;
template <typename E> class GTNode {
private:
E element;
GTNode<E>* rent;
GTNode<E>* leftchild;
GTNode<E>* rightsib;
public:
GTNode(const E& value) { // Constructor
rent = leftchild = rightsib = NULL;
element = value;
}
GTNode(const E& value, GTNode<E>* par, GTNode<E>* leftc, GTNode<E>* rights) { // Constructor
element = value;
rent = par;
leftchild = leftc;
rightsib = rights;
}
~GTNode() {} // Destructor
E value() { return element; } // Return node's value
bool isLeaf() { return leftchild == NULL; } // True if node is a leaf
GTNode* parent() { return rent; } // Return node's parent
GTNode* leftmostChild() { return leftchild; } // Return node's first child
GTNode* rightSibling() { return rightsib; } // Return node's right sibling
void setValue(E&) { element = value; } // Set node's value
void insertFirst(GTNode<E>* n) { // Insert as the first child
n->rightsib = leftchild;
n->rent = this;
leftchild = n;
}
void insertNext(GTNode<E>* n) { // Insert as the right sibling
n->rightsib = rightsib;
n->rent = rent;
rightsib = n;
}
void removeFirst() { // Remove first child from tree
if (leftchild == NULL) return;
GTNode<E>* temp = leftchild;
leftchild = leftchild->rightsib;
delete temp; // BAD -- lose all its subtree!
}
void removeNext() { // Remove right sibling from tree
if (rightsib == NULL) return;
GTNode<E>* temp = rightsib;
rightsib = rightsib->rightsib;
delete temp; // BAD -- lose all its subtree!
}
};
/////////////////////////////////////////////
template <typename E> class GenTree {
private:
GTNode<E>* rt;
// Print using a preorder traversal
void printhelp(GTNode<E>* root)
{
/*if (root->isLeaf())
{
cout << "Leaf: ";
}
else
{
cout << "Internal: ";
}
cout << root->value() << "\n";
// Now process the children of "root"
for (GTNode<E>* temp = root->leftmostChild(); temp != NULL; temp = temp->rightSibling())
{
printhelp(temp);
}*/
if (root->isLeaf())
{
cout << "Leaf: ";
}
else
{
cout << "Internal: ";
}
cout << root->value() << "\n";
if (root->rightSibling() != NULL)
{
printhelp(root->rightSibling());
}
if (root->leftmostChild() != NULL)
{
printhelp(root->leftmostChild());
}
}
public:
GenTree()
{
rt = NULL;
} // Constructor
// AWFUL! Throw away the storage
~GenTree() { rt = NULL; } // Destructor
// AWFUL! Throw away the storage
void clear() { rt = NULL; } // Send all nodes to free store
// Return the root of the tree
GTNode<E>* root()
{
return rt;
}
// Combine two trees
void newroot(const E& value, GTNode<E>* first, GTNode<E>* sib)
{
clear();
rt = new GTNode<E>(value, (GTNode<E>*)NULL, first, sib);
}
// Print a tree
void print()
{
printhelp(rt);
}
};