问题描述
我必须在 C++ 中实现一个红/黑树 (RBTree),继承自我已经创建的二叉搜索树 (BSTree) 类。
BSTree 类包含一个指向树根的节点指针(节点是我为 BSTree 创建的类)。
我想创建一个名为“RBTNode”的Node子类,其中包含颜色属性和相关方法(所以RBTNode是Node的子类),然后我想创建继承自BSTree的RBTree类,但是使用新的 RBTNode 而不是标准的 Node。
结构如下:
- BSTree 包含节点;
- RBTNode 是 Node 的子类;
- RBTree 是 BSTree 的子类;
- RBTree 包含 RBTNode;
我怎么能做到这一点?
解决方法
正如 Jarod42 在评论中所建议的,您可以通过使节点类型成为 BSTree
类的模板参数来实现这一点。
假设您有这两个节点类:
template<typename KeyT>
class BSNode {
public:
KeyT key;
// ...
};
template<typename KeyT>
class RBNode : public BSNode<KeyT> {
public:
bool color;
};
然后您可以将节点类型模板参数添加到 BSTree
并使其默认为 BSNode
。然后您可以在继承 RBNode
时使用 RBTree
。
template <typename KeyT,typename NodeT = BSNode<KeyT>>
class BSTree {
protected:
NodeT *root;
};
template <typename KeyT>
class RBTree : public BSTree<KeyT,RBNode<KeyT>> {
// root will be of type RBNode<KeyT>* here
};