#include #include class BST; class BSTNode { public: BSTNode(int key); BSTNode(int key, std::weak_ptr parent); bool IsLeaf() const; bool IsMissingChild() const; bool HasLeftChild() const; bool HasRightChild() const; void DeleteChild(std::shared_ptr v); void ReplaceChild(std::shared_ptr v, std::shared_ptr u); private: int key_; std::weak_ptr parent_; std::shared_ptr left_; std::shared_ptr right_; friend BST; }; // class BSTNode class BST { public: BST(); void Insert(int key); bool Delete(int key); bool Find(int key) const; std::string JSON() const; size_t size() const; bool empty() const; int DeleteMin(); private: void DeleteLeaf(std::shared_ptr currentNode); int DeleteMin(std::shared_ptr currentNode); std::shared_ptr root_; size_t size_; }; // class BST