c++ - 更改类中的字段
问题描述
我有一个运行良好的二叉树类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...
}
第二个问题是root
ofBTree
因为在新RBTree
类中root
应该是RBTreeNode
类型。
那么,有没有办法以 OOP 方式解决它?还是我应该改变我的方法?
解决方案
我猜继承不是解决这个问题的好方法。红黑树节点必须有颜色变量,如果你使用继承,你不能以正确的方式保持这个值。我的红黑树节点是这样的:
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);
}
};
推荐阅读
- mysql - laravel 查询生成器添加和或条件
- reactjs - 有什么方法可以改变 Material-UI 添加样式标签 html 元素的位置吗?
- objective-c - 在 XCTestCase 中自动关闭对话框
- javascript - 服务工作者在本地服务时注册,但不能在线工作
- python - 性能问题:根据未来值标记 Pandas 系列中的项目
- python - Kivy:MDIconButton 不在 Gridlayout 中居中,并且带有按钮行为的 MDLabel 无法移动
- c++ - 当我尝试在 C++ 中编译和运行我的“main.cpp”文件时,导致调用中止方法的原因是什么?
- php - 在php中删除开始日期和结束日期之间的日期数组
- c++ - 如何在 C++ 中接受用户输入作为向量的长度
- java - ObjectMapper 的 readValue 方法给出 MismatchedInputException