#ifndef BINARYTREELNK_HPP #define BINARYTREELNK_HPP #include "../binarytree.hpp" namespace lasd { template class BinaryTreeLnk : virtual public BinaryTree{ // Must extend BinaryTree protected: struct NodeLnk : virtual public BinaryTree::Node { // Must extend Node protected: using BinaryTree::Node::data; struct NodeLnk* left = nullptr; struct NodeLnk* right = nullptr; public: struct NodeLnk& operator=(const NodeLnk&); // Copy assignment of abstract types should not be possible. struct NodeLnk& operator=(NodeLnk&&) noexcept; // Move assignment of abstract types should not be possible. bool IsLeaf() const noexcept override; // (concrete function should not throw exceptions) bool HasLeftChild() const noexcept override; // (concrete function should not throw exceptions) bool HasRightChild() const noexcept override; // (concrete function should not throw exceptions) struct NodeLnk& LeftChild() const override; // (concrete function must throw std::out_of_range when not existent) struct NodeLnk& RightChild() const override; // (concrete function must throw std::out_of_range when not existent) friend class BinaryTreeLnk; }; protected: using BinaryTree::size; struct BinaryTreeLnk::NodeLnk* root = nullptr; struct BinaryTreeLnk::NodeLnk* CreateNode(const Data& data); public: // Default constructor BinaryTreeLnk() = default; BinaryTreeLnk(const LinearContainer&); // A binary tree obtained from a LinearContainer BinaryTreeLnk(const BinaryTreeLnk&); BinaryTreeLnk(BinaryTreeLnk&&) noexcept; virtual ~BinaryTreeLnk(); BinaryTreeLnk& operator=(const BinaryTreeLnk&); BinaryTreeLnk& operator=(BinaryTreeLnk&&) noexcept; bool operator==(const BinaryTreeLnk&) const noexcept; bool operator!=(const BinaryTreeLnk&) const noexcept; // Specific member functions (inherited from BinaryTree) NodeLnk& Root() const override; // Override BinaryTree member (throw std::length_error when empty) // Specific member functions (inherited from Container) void Clear() override; // Override Container member // Specific functions struct BinaryTreeLnk::NodeLnk* CreateTreeFromLinearContainerInBreadth(const LinearContainer&,ulong); struct BinaryTreeLnk::NodeLnk* CopyTree(struct BinaryTreeLnk::Node*); void DeleteTree(BinaryTreeLnk::NodeLnk* node); }; } #include "binarytreelnk.cpp" #endif