Я пытаюсь реализовать bintree, но у меня проблемы с методом insert. Если я добавлю первый элемент, программа не сработает, но, когда я представим 2 или более элемента, сбой программы.
Это код
template <typename T>
void Arbol<T>:: insertar( T c){
if(laraiz==0)
{
laraiz=new celdaArbol;
laraiz->elemento=c;
laraiz->padre=laraiz->hizqu=laraiz->hder=0;
}
else {
celdaArbol *com=laraiz;
bool poner=false;
while(poner==false){
if(c>com->elemento){
if(com->hder==0){
com->hder= new celdaArbol;
com->hder->elemento=c;
com->hder->padre=com;
poner=true;
}
else{
com=com->hder;
}
}
else {
if(com->hizqu==0){
com->hizqu= new celdaArbol;
com->hizqu->elemento=c;
com->hizqu->padre=com;
poner=true;
}
else {
com=com->hizqu;
}
}
}
}
}
Я думаю, что проблема в другом:
else{
com=com->hizqu; //com=com->hder;
}
Потому что я видел в отладчике, что программа вводит несколько раз в раздел и не должна делать.
Согласно этому коду:
laraiz->padre=laraiz->hizqu=laraiz->hder=0;
Вы не правильно инициализировать указатели hizqu
и hder
к nullptr
в конструкторе celdaArbol
класса. И вы не инициализируете их ни в одной из ветвей if(c>com->elemento){
поэтому они, похоже, имеют значения мусора.
Кроме того, ваш код может стать более читаемым и менее подвержен ошибкам при использовании правильных конструкций C++:
celdaArbol *com=laraiz;
while( true ){
celdaArbol *&ptr = c > com->elemento ? com->hder : com->hizqu;
if( ptr ) {
com = ptr;
continue;
}
ptr = new celdaArbol;
ptr->elemento=c;
ptr->padre=com;
ptr->hder = ptr->hizqu = nullptr;
break;
}
Этот код логически равен вашему, за исключением того, что он короче, легче читается, избегает дублирования и исправляет вашу ошибку.
Для каждого листового узла (кроме корня дерева) вы никогда не инициализируете левый дочерний или правый дочерний узел не как неопределенное значение.
Вы, вероятно, хотели инициализировать их как nullptr
.
Вот один пример:
if (com->hizqu==0){
com->hizqu = new celdaArbol;
com->hizqu->elemento = c;
com->hizqu->padre = com;
poner = true;
// What is the value of com->hizqu->hizqu?
// What is the value of com->hizqu->hder?
}