首页 > 解决方案 > 更改类中的字段

问题描述

我有一个运行良好的二叉树类BTree,我没有改变任何东西。

class BTreeNode {
private:
    vector<string> data;
    BTreeNode *parent = nullptr;
    BTreeNode *leftChild = nullptr;
    BTreeNode *rightChild = nullptr;

public:
    BTreeNode();

    BTreeNode(vector<string> noteData);

    // getters and setters...
};

class BTree {
private:
    BTreeNode *root = nullptr;

public:
    BTree();

    void add(vector<string> newNodeValue);

    // other methods
};

但现在我想创建一个新的红黑树类RBTree。我认为通过继承来实现是个好主意。

第一个问题发生在红黑树的节点中。他们有一个额外的领域——颜色。如果红黑树的节点类RBTreeNode继承BTreeNode,那么问题是 getter 和 setterBTreeNode返回一个BTreeNode对象,但我需要RBTreeNode.

class RBTreeNode : public BTreeNode {
public:
    enum Colour { BLACK, RED };
private:
    Colour colour;

public:
    // constructors, getters and setters...
}

第二个问题是rootofBTree因为在新RBTree类中root应该是RBTreeNode类型。

那么,有没有办法以 OOP 方式解决它?还是我应该改变我的方法?

标签: c++oopinheritancearchitecture

解决方案


我猜继承不是解决这个问题的好方法。红黑树节点必须有颜色变量,如果你使用继承,你不能以正确的方式保持这个值。我的红黑树节点是这样的:

struct RB_Tree_Node {
    vector<string> data;
    bool color;  // black = 0, red = 1;
    Node* left, * right, * parent;
    Node* sibling(Node* x) {
        if (x->parent == NULL)
            return NULL;

        if (x->parent->left)
            return x->parent->right;

        return x->parent->left;
    }
    bool hasRedChild() {
        return (left != NULL && left->color == 1) || (right != NULL && right->color == 1);
    }
};


推荐阅读