如何从普通的bst继承一棵红黑树

时间:2019-02-12 13:54:18

标签: 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()方法。我该如何解决这个将近两个星期的生命?

糟糕:如果有人需要,我的代码在https://github.com/dodonut/Algorithms/tree/master/Data_Structures

我尝试在noderb_node内的方法上重写构造函数上nullptrrb_node的变量(但不能强制转换return rb_node)(但基类方法的签名不同)

1 个答案:

答案 0 :(得分:4)

一个可能的解决方案可能是让基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;
    ...
};