对于一个学校项目,我需要为一个索引元组和类型为T的值构建一个BinarySearchTree,我决定使用左右子指针(对于其他实例,但对我而言) .
为了使类更加真实和可读,我构建了3个不同的类:Tree,BinaryTree和带继承的BinarySearchTree .
我在BinaryTree类中声明了getter和左右子项的setter,类看起来像这样:
template <typename T>
class ArbreBinaire : public Arbre<T>
{
private:
ArbreBinaire<T>* _leftChild;
ArbreBinaire<T>* _rightChild;
public:
ArbreBinaire(lu index = 0, T element = T(0), ArbreBinaire<T>* lchild = nullptr, ArbreBinaire<T>* rchild = nullptr) :
Arbre<T>(index, element), _leftChild(lchild), _rightChild(rchild) {};
virtual ArbreBinaire<T>* getLC() const { return _leftChild; }
virtual ArbreBinaire<T>* getRC() const { return _rightChild;}
void setLC(ArbreBinaire<T>* lc) { _leftChild = lc; lc->setParent(this); }
void setRC(ArbreBinaire<T>* rc) { _rightChild = rc; rc->setParent(this); }
virtual ~ArbreBinaire() = default;
};
在我的BinarySearchTree中,在一些地方我需要浏览我的树(插入或搜索例子) . 所以最后我的问题是:获得我的对象的左子项的最佳方法是什么,这是BinarySearchTree类型并保持连续性(BST让BST离开孩子和BST右子)
我想到了多种选择:
-
虚拟getter和setter并在每个派生类中重新定义它,但还有另外两个"problems"与该解决方案 .
-
我的BST中是否还有2个其他成员,它们的类型为BST *并且基本上指向与BinaryTree中相同的对象?
-
我应该重新定义我的getter以返回这样的dynamic_cast版本:
BST<T>* getLC() { return dynamic_cast<BST<T>*> (this->BinaryTree::getLC()) }
? -
将我的所有成员,getter和setter放在我的BST类中(但这与BinaryTree的定义相反,基类:没有子节点的BinaryTree不是BinaryTree)
3.每当我需要得到我的左或右孩子时,只需投掷
4.每次我需要在BST(派生类)中使用方法时进行策划?
5.还有其他建议吗?