对于一个学校项目,我需要为一个索引元组和类型为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.还有其他建议吗?