указатели — проблемы с вставкой красного черного дерева

В настоящее время я работаю над заданием, в котором я должен реализовать простую версию Red Black Tree. В настоящее время я работаю в XCode, и это в настоящее время дает мне ошибку GDB: Program received signal: EXC_BAD_ACCESS… что я предполагаю, что утечка памяти … но я не могу определить причину, почему это происходит. Отладчик показал мне, что проблема в моем RedBlackTree::treeInsert(char *data) функция …. в частности, с оператором if в теле цикла while if (strcmp(data, x->data) < 0),

отладчик показывает, что this = 0x7fff5fc01052 а также data = 0x100001a61 который хранит символ (буква А). Однако это показывает, что x = 0x4810c48348ec8948 но все его свойства (parent, left, right, data) все пусты.

Итак, следующее, что я попробовал, было убедиться, что я инициализирую эти переменные как Nil в моем node() конструктор. Но это дало мне ошибку: 'Nil' was not declared in this scope… так что я сейчас их закомментировал. Не уверен, что здесь происходит ..? Любая помощь будет принята с благодарностью.

class node
{
public:
char         *data;         // Data containing one character
node         *parent;       // pointer to this node's parent
node         *left;          // pointer to this node's left child
node         *right;          // pointer to this node's right child
bool         isRed;         // bool value to specify color of node
node();
};

node::node(){
this->data = new char[1];
isRed = true;
//this->parent = Nil;
//this->left = Nil;
//this->right = Nil;
}

красный черный класс дерева и методы

class RedBlackTree {
public:
/*constructor*/
RedBlackTree();

node* getRoot(){
return this->Root;
}

/*RB-INSERT*/
void rbInsert(char *data);
node treeInsert(char *data);
void rbInsertFixup(node *z);

/*ROTATE*/
void leftRotate(node *z);
void rightRotate(node *z);

/*INORDER TRAVERSAL*/
void inOrderPrint(node *root);private:
node    *Root;    /*root*/
node    *Nil;    /*leaf*/

};RedBlackTree::RedBlackTree()
{
this->Nil = new node();
this->Root = Nil;
}

void RedBlackTree::rbInsert(char *data){
node z = treeInsert(data);
rbInsertFixup(&z);

} // end rbInsert()

node RedBlackTree::treeInsert(char *data){

node *x;
node *y;
node *z;

y = Nil;
x = Root;
while (x!= Nil) {
y = x;
if (strcmp(data, x->data) < 0) {
x = x->left;
} else {
x = x->right;
}
}
z = new node(); // create a new node
z->data = data;
z->parent = y;
z->isRed = true; // set  new node as red
z->left = Nil;
z->right = Nil;

if (y == Nil) {
Root = z;
} else {
if (strcmp(data, y->data)<= 0) {
y->left = z;
} else {
y->right = z;
}

}
return *z;
}

вот моя основная функция

int main(){RedBlackTree *RBT;
node* root = RBT->getRoot();
RBT->rbInsert((char *)"A");
RBT->inOrderPrint(root);
return 0;

}

0

Решение

У вас переполнение буфера повсюду! Строка, содержащая один символ, на самом деле два символы, так как он имеет специальный завершающий символ. Вы выделяете память для одного символа для данных, но использование строк приведет к переполнению этих буферов.

1

Другие решения

В основном у вас просто есть указатель в RBT на дерево, не инициируя его, и отзовитесь к неопределенному поведению земли.

(и код имеет массу других подозрительных точек)

0

По вопросам рекламы [email protected]