/* * bintree.cpp * * Created on: 27.11.2015 г. * Author: trifon */ #include using namespace std; template struct TreeNode { T data; TreeNode *left, *right; TreeNode(T const& _data = T(), TreeNode* _left = NULL, TreeNode* _right = NULL) : data(_data), left(_left), right(_right) {} }; template class BinaryTree { private: TreeNode* r; TreeNode* copyNode(TreeNode* n) { if (n == NULL) return n; cerr << "Copying tree" << endl; return new TreeNode(n->data, copyNode(n->left), copyNode(n->right)); } void eraseNode(TreeNode* n) { if (n != NULL) { eraseNode(n->left); eraseNode(n->right); delete n; } } BinaryTree(TreeNode* p) : r(copyNode(p)) {} public: BinaryTree() : r(NULL) {} BinaryTree(T const& x, BinaryTree const& lt, BinaryTree const& rt) : r(new TreeNode(x, copyNode(lt.r), copyNode(rt.r))) {} BinaryTree(BinaryTree const& bt) : r(copyNode(bt.r)) { } BinaryTree& operator=(BinaryTree const& bt) { if (this != &bt) { eraseNode(r); r = copyNode(bt.r); } return *this; } ~BinaryTree() { eraseNode(r); } T root() const { if (r == NULL) return T(); return r->data; } BinaryTree leftTree() const { return BinaryTree(r->left); } BinaryTree rightTree() const { return BinaryTree(r->right); } bool empty() const { return r == NULL; } }; template ostream& operator<<(ostream& os, BinaryTree const& bt) { if (bt.empty()) return os << '.'; return os << '(' << bt.root() << ' ' << bt.leftTree() << ' ' << bt.rightTree() << ')'; }