下面是我编写的用于将节点插入简单二进制搜索树的代码。现在我试图通过将相同的Node类继承到RBNode类来实现Red Black Tree。
void Node::insert_node(Tree *t)
{
Node *cur_node = t->get_root();
Node *prev_node;
while(NULL != cur_node)
{
prev_node = cur_node;
if(this->data < cur_node->data)
{
cur_node = cur_node->left;
}
else
{
cur_node = cur_node->right;
}
}
if(NULL == t->get_root())
{
cur_node = this;
t->set_root(cur_node);
}
else
{
if(this->data < prev_node->data)
{
prev_node->left = this;
}
else
{
prev_node->right = this;
}
this->parent = prev_node;
}
}
对于RBNode,此函数将保持不变,除了Node *应由RBNode *替换,Tree *由RBTree *替换。我认为在RBNode类中编写相同的函数实际上完全相同,这是徒劳的。如果我使用相同的功能,我无法访问RBNode的成员,因为我插入树中的是节点。
实现这一目标的有效方法是什么?我是C ++的新手,所以如果我错过了任何明显的东西,请告诉我。
答案 0 :(得分:2)
如果RBNode
继承自Node
且RBTree
继承自Tree
,则RBNode 为 Node
和{ {1}}是RBTree
。事实上,只要此函数为Tree
或public
,并且继承本身为protected
或public
,您就可以在{{1}上调用它它会起作用。
这是一个小例子:
protected
答案 1 :(得分:2)
除了可以,你根本不需要使用继承。没有继承的解决方案是使用模板。如下:
template <class N, class T>
void insert_node(N *node, T *tree);
此代码适用于两种节点。这个问题是它必须位于全局或第三个不相关的类中。您可以让Node继承自抽象类INode,Tree继承自抽象类ITree。此功能将位于INode中。派生的节点和树将具有任何独特的功能。