У меня есть проблема, у меня есть этот класс, который теперь работает, потому что у меня есть атрибут public, но если я помещу его в приватный или защищенный и унаследованный для второго класса, он не работает, как я могу это сделать Это?
template <typename T>
class BinaryNode
{
public:
T key;
BinaryNode<T>* left;
BinaryNode<T>* right;
BinaryNode<T>* parent;
BinaryNode(){}
~BinaryNode(){}
};
И это:
template <typename T>
class BinarySearchTree
{
private:
BinaryNode<T>* root;
BinaryNode<T>* newNode(T key);
BinaryNode<T>* minimum(BinaryNode<T>* node);
BinaryNode<T>* maximum(BinaryNode<T>* node);
BinaryNode<T>* successor(BinaryNode<T>* node);
void insert(BinaryNode<T>** node, T key);
BinaryNode<T>* search(BinaryNode<T>* node, T key);
void distance(BinaryNode<T>* node, T key);
void inorderTreeWalk(BinaryNode<T>* node);
public:
BinarySearchTree();
~BinarySearchTree();
void insert(T key);
BinaryNode<T>* search(T key);
void distance(T key);
void inorderTreeWalk();
BinaryNode<T>* remove(BinaryNode<T>* node);
};
Похоже, что узел тесно связан с деревом:
Вы можете сделать дерево другом узла или использовать вложенный класс:
class Node {
private:
friend class Tree;
...
};
class Tree {
...
};
или же
class Tree {
private: // maybe protected
class Node {
public:
...
};
};
Вы могли бы сделать доступными функции «получения» для узлов, чтобы вы могли проходить по дереву в вашем бинарном дереве поиска.
template <typename T>
class BinaryNode
{
private:
T key;
BinaryNode<T>* left;
BinaryNode<T>* right;
BinaryNode<T>* parent;
public:
BinaryNode(){}
~BinaryNode(){}
T const& getKey() const { return key; }
const BinaryNode<T>* getLeft() const { return left; }
const BinaryNode<T>* getRight() const { return right; }
const BinaryNode<T>* getParent() const { return parent; }
};
Сейчас BinarySearchTree<T>
может проходить через дерево, чтобы выполнять поиск, не имея прямого доступа к членам или не имея возможности изменять их.
Конечно, вам, вероятно, понадобятся некоторые методы для изменения значения (функции set)