Я реализовал красное черное дерево, но когда я запускаю программу с терминала, она дает ошибку: ядро отказа от сегментации. Я думаю, что я получаю доступ к местоположению, к которому я не должен обращаться, или я получаю доступ к чему-то нулевому.
Это мой метод вставки:
template <class Item, class Key>
void RedBlackTree<Item, Key>::Insert(RedBlackTree<Item,Key> Tree, Node<Item, Key> *z)
{
Node <Item, Key> *T=0;
Node<Item, Key>* nill=T->nill;
Node<Item, Key>* root=T->root;
Node<Item, Key> *y;
Node<Item, Key> *x;
y=nill;
x=root;
//x= T->getRoot();
while(x != nill)
{
y=x;
if(z->getKey() < x->getKey())
x= x->getLeft();
else
x = x->getRight();
}
z->setParent(y);
if(y == nill)
z=T->root;
else
if((z->getKey())<(y->getKey()))
{
y->setLeft(z);
}
else
{
y->setRight(z);
}
z->setLeft(nill);
z->setRight(nill);
z->colour1 = 'R';
FixingInsert(Tree,z);
}
Это часть моей основной:
Node<int, int> q = Node<int, int>(0,5);
RedBlackTree<int, int> tree1;
tree1.Insert(tree1, &q);
Может ли кто-нибудь помочь? Я новичок в шаблонах, и я был бы очень признателен, если кто-то мне поможет.
Заранее спасибо.
Вы разыскиваете NULL-указатель (дважды!):
Node <Item, Key> *T=0;
Node<Item, Key>* nill=T->nill;
Node<Item, Key>* root=T->root;
У меня такое чувство, что вы хотели написать:
RedBlackTree <Item, Key> *T= &Tree;
Node<Item, Key>* nill=T->nill;
Node<Item, Key>* root=T->root;
или
RedBlackTree <Item, Key> *T= this;
Node<Item, Key>* nill=T->nill;
Node<Item, Key>* root=T->root;
Хотя оба будут избыточными, потому что у вас уже есть указатель в this
(но вы можете получить доступ к переменным-членам напрямую), и у вас уже есть объект Tree
, члены которого вы можете получить через Tree.
, (пока они public
).
Также почему вы передаете экземпляр объекта самому методу? Это совершенно не нужно. Даже ссылка будет излишней.
Вероятно, вы должны удалить параметр Tree
, удалить строку Node <Item, Key> *T=0;
и удалить все T->
.