【发布时间】:2017-07-22 12:23:12
【问题描述】:
我在尝试实现红黑树类时遇到了问题。我之前构建了一个二叉树类,所以我从它继承了我的红黑树。
二叉树声明如下:
template <typename KeyType, typename DataType>
class BTree{
protected:
struct BTreeNode{
KeyType key;
DataType data;
BTreeNode *left;
BTreeNode *right;
BTreeNode *parent;
BTreeNode(const KeyType &Key, const DataType &Data);
};
BTreeNode *root;
void clear(BTreeNode *root);
public:
BTree();
virtual ~BTree();
virtual bool insert(const KeyType &Key, const DataType &Data);
virtual bool erase(const KeyType &key);
DataType &getFirst(const KeyType &Key);
/**** some other methods ****/
}; // class bTree
而红黑树是这样的:
template <typename KeyType, typename DataType>
class RBTree : public BTree<KeyType, DataType>{
protected:
struct RBTreeNode : BTree<KeyType, DataType>::BTreeNode{
enum RB{red, black} rb;
RBTreeNode(const KeyType &Key, const DataType &Data, RB Rb=red);
};
private:
void leftRotate(RBTreeNode *x);
void rightRotate(RBTreeNode *x);
public:
/**** some other methods ****/
}; // class RBTree
问题来了,当我实现RBTree::leftRotate()时,我必须写RBTreeNode *y = x->right和y=y->left之类的东西,但是x->right和y->left是BTreeNode *,并且不能自动转换为RBTreeNode * .
我不希望我的代码充满 static_cast<RBTreeNode *>(x) 之类的东西,而且我不想重新定义 RBTreeNode 或 RBTree 类,这意味着我必须重写 BTree 中的每个方法,例如我可以使用的 getFirst()直接。
那么我应该如何构造RBTree呢?我必须重写整个 RBTree 类吗?非常感谢。
【问题讨论】:
-
在
RBTreeNode中,有一个类似RBTreeNode* right() { return static_cast<RBTreeNode*>(BTreeNode::right); }的方法。然后使用x->right()代替x->right -
谢谢。没想到……
标签: c++ inheritance type-conversion