#include namespace BinaryTree { template struct Node { Node * parent; T value; std::unique_ptr> left; std::unique_ptr> right; Node(T const & _value, Node * _parent) : parent(_parent), value(_value) {} }; template class Tree { private: std::unique_ptr> root; public: void Insert(T & value) { Node * previousPtr = nullptr; std::unique_ptr> & ptr = root; while(ptr != nullptr) { previousPtr = ptr.get(); if(ptr->value > value) { ptr = ptr->left; } else { ptr = ptr->right; } } ptr = std::make_unique>(value, previousPtr); } bool Contains(T const & value) { std::unique_ptr> & ptr = root; while(ptr != nullptr) { if(ptr->value == value) { return true; } if(ptr->value > value) { ptr = ptr->left; } else { ptr = ptr->right; } } return false; } void Delete(T const & value) { } }; }