如何从正常的BST继承一棵红黑树

How to inherit a red black tree from a normal bst

本文关键字:一棵 继承 BST      更新时间:2023-10-16

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

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;
    ...
};