#include <iostream>
#include <new>
#include <fstream>
#include <sstream>
template <class T>
class Node {
public:
T value;
Node *left;
Node *right;
Node(T value);
static bool add(Node *&root, T value);
static void release(Node *&root);
static void dump(Node *&root);
};
template <class T> Node<T>::Node(T value) {this->value = value; left = right = 0; }
template <class T> bool Node<T>::add(Node<T> *&root, T value) {
if (!root) {
Node *s;
if ((s = new(std::nothrow)Node(value)) == 0)
return false;
root = s;
return true;
}
if (value < root->value)
return Node::add(root->left, value);
else
return Node::add(root->right, value);
}
template <class T> void Node<T>::dump(Node<T> *&root) {
if (!root)
return;
dump(root->left);
std::cout << root->value << std::endl;
dump(root->right);
delete root;
root = 0;
}
template <class T> void Node<T>::release(Node<T> *&root) {
if (!root)
return;
release(root->left);
release(root->right);
delete root;
root = 0;
}
/*--------------------------------------------------------------------------*/
typedef int DataType;
class Tree {
Node<DataType> *root;
public:
Tree();
~Tree();
bool add(DataType value);
void load(std::istream &fin);
void dump();
};
Tree::Tree() { root = 0; }
Tree::~Tree() { Node<DataType>::release(root); }
bool Tree::add(DataType value) { return Node<DataType>::add(this->root, value); }
void Tree::dump() { Node<DataType>::dump(root); }
void Tree::load(std::istream &fin) {
bool flag_ok = true;
std::string buff;
while (getline(fin, buff, '\n')) {
std::stringstream ss(buff);
DataType value;
ss >> value;
if(!this->add(value)) { flag_ok = false; break; }
}
if (!flag_ok)
std::cerr << "memory full, vomited." << std::endl;
}
/*--------------------------------------------------------------------------*/
int main() {
Tree *tree = new Tree();
ifstream fin("test.txt");
if (fin)
tree->load(fin);
fin.close();
tree->dump();
delete tree;
return 0;
}
/* end */