#include #include #include #include template class Node { public: Node() : isEmpty(true), left(0), right(0) {} void insert(const T & val) { if (isEmpty) { value = val; isEmpty = false; } else if (value > val) { if (!left) left = new Node; left->insert(val); } else { if (!right) right = new Node; right->insert(val); } } std::list items() const { std::list r; if (left) { std::list t = left->items(); r.insert(r.end(), t.begin(), t.end()); } if (!isEmpty) { r.push_back(value); } if (right) { std::list t = right->items(); r.insert(r.end(), t.begin(), t.end()); } return r; } private: T value; bool isEmpty; Node *left, *right; }; template class Tree { public: Tree() : root(0) {} Tree & operator << (const T & value) { if (!root) root = new Node; root->insert(value); return *this; } std::list items() const { if (root) return root->items(); else return std::list(); } private: Node* root; }; template class Print : public std::unary_function { public: Print(std::ostream * o) : os(o) {} void operator () (const T & value) { (*os) << value << ", "; } private: std::ostream * os; }; template std::ostream & operator << (std::ostream & os, const Tree & tree) { std::list items = tree.items(); std::for_each(items.begin(), items.end(), Print(&os)); return os; } int main(int, char**) { Tree<> a; Tree b; a << 123 << 222 << 456 << 22; b << "mano" << "batai" << "buvo" << "du"; std::cout << a << std::endl << b << std::endl; }