如何从正常的BST继承一棵红黑树
How to inherit a red black tree from a normal bst
我在继承方面遇到了巨大的麻烦。我有一个普通节点如下(请忽略代码中的任何拼写错误,我现在没有,但它编译得很好(
template<typename T>
class Node {
Node<T> *parent, *left, *right;
...//simple methods
}
然后,我使用刚刚创建的节点实现一个普通BST
:
template<typename T>
class tree {
virtual Node<T>* insert(T value);
...// other methods of tree
}
现在我想做一棵红黑树,但它的代码几乎是一样的,所以我只是尝试覆盖,比如说,插入:
template<typename T>
class rb_node : public node<T> {
int color;
...//methods to retrieve and set the color as well the constructor
}
template<typename T>
class rb_tree : public tree<T> {
Node<T> *insert(T value){
auto z = (rb_node<T>*)tree<T>::insert(value);
while(z->parent()->color() == RED)...
}
由于我强制转换,z->parent()
被识别为rb_node
,但父级没有,因为它是在基类中构造的,因此它没有color()
方法。我如何解决这个杀死我近两周的问题?
Obs:如果有人需要,我的代码 https://github.com/dodonut/Algorithms/tree/master/Data_Structures。
我试图覆盖node
的变量以在构造函数上rb_node
(但不能强制转换为nullptr
(,在方法内部rb_node
return rb_node
(但基类方法的签名不同(
一种可能的解决方案可能是让基tree
类也采用可选的NodeType
模板参数?如在
template<typename T, typename NodeT = Node<T>>
class tree
{
...
virtual NodeT* insert(T const& value);
...
};
然后子类可以使用其特殊rb_node
:
template<typename T>
class rb_tree : public tree<T, rb_node<T>>
{
...
rb_node<T>* insert(T const& value) override;
...
};
相关文章:
- 在运行时检查继承是否只有一种类型和 void*
- 我该如何平衡一棵退化的树?C++数据结构
- 继承是否是将一组模型参数传递给不同类的可行解决方案
- 有没有一种干净(更)的方法将 CRTP 与可变参数继承混合在一起?
- 在我的情况下,多重继承是一种好的设计模式吗?
- C++ - 有没有办法只继承一次某些函数,而其他函数在多次继承中多次继承?
- 按类型为继承的类制作一种切换案例
- 重建一棵树
- 如何从正常的BST继承一棵红黑树
- 从森林里造一棵n元树
- 二进制搜索树 - 将一棵树复制到另一棵树中
- C 复制一棵二进制树
- C++一般的继承误解
- 求一棵树的直径
- 在C++中从预购中构建一棵树
- 遍历一棵 n 元树
- std::char_traits中使用的静态方法是否是一种继承
- 如何检查一棵树是否是另一棵树的子树
- 如何将一棵树划分为两个子树
- 在一棵有191个节点且高度为9的二叉树中找到一个键所需的最大比较次数是多少?