c++ - 如何从普通bst继承红黑树

标签 c++ algorithm inheritance

我在继承方面遇到了很大的麻烦。我有一个正常的节点如下(请忽略代码中的任何错字,我现在没有它,但它编译得很好)

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 .

我试图在中的方法中,在构造函数上(但不能转换nullptr)将node的变量覆盖到rb_node rb_node返回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;
    ...
};

关于c++ - 如何从普通bst继承红黑树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54651653/

相关文章:

c++ - 带有 Boost 的 Cuda

ruby - 结合所有组合以获得完整的集合

algorithm - 树结构的循环表示

java - 将子类添加到列表 - 方法 add(capture#2-of ? extends TopBean)...不适用于参数 (TopBean)

Java - 扩展 HashMap - 对象与泛型行为

c++ - Boost Graph Library : How do I keep a permanant reference to a vertex?(即不受顶点重新编号的影响)

c++ - 改变 boost::combine 的结果

java - 为什么这个字符串连接算法需要这么多步骤?

c++ - 为什么 C++ 不允许基类实现派生类的继承接口(interface)?

c++ - 打印出 std::string